29 Ağustos 2021 Pazar

Yazılım Mimarisi - Space-Based Architecture

Giriş
Bu mimariyi ilk olarak burada gördüm. Şeklen şöyle

Açıklaması şöyle
The main idea behind the space-based pattern is the distributed shared memory to mitigate issues that frequently occur at the database level. The assumption is that by processing most of operations using in-memory data we can avoid extra operations in the database, thus any future problems that may evolve from there (for example, if your user activity data entity has changed, you don’t need to change a bunch of code persisting to & retrieving that data from the DB).

The basic approach is to separate the application into processing units (that can automatically scale up and down based on demand), where the data will be replicated and processed between those units without any persistence to the central database (though there will be local storages for the occasion of system failures).
Bu mimaride scalability (ölçeklendirme) ön planda. Bu açıda  cloud mimarilere benziyor. 

Ayrıca kendi kendine yeterli Processing Units (PU) var. Bu açıdan da mikro service mimarisine benziyor.

Veri tabanı olarak ta Distributed Shared Memory veya Grid Computing kullanıyor. 

28 Ağustos 2021 Cumartesi

Türk Savunma Sanayiinde Yazılımcı Olarak Çalışılır mı ?

Merhabalar,

Bu yazıyı yazmaya karar vermemin sebebi, bu konuda gelen sorulara cevap vermek. Kendi bakış açımdan cevap veriyorum. Bu bakış açım 2021 yılına ait. İleride belki farklı düşünebilirim diye tarihi not ediyorum.

Genel bir cevap vermek gerekirse bence çalışılmaz. Benim açımdan sebeplerden bazıları şöyle

1. Teknoloji
"Genel anlamda" savunma sanayiinde kullanılan teknoloji eski. Yani cazip değil. Bu konuyu çok fazla insandan duyuyorum.  Maalesef yazılım dünyasındaki büyük "Cloud Devrimini" ve bu devrime bağlı olarak gerçekleşen yan gelişmeleri Savunma Sanayii yazılım şirketleri kaçırmış durumda. 

Dediğim gibi bu genel bir madde. Her proje ve şirket için doğru olmayabilir.

2. Kontrollü Yazılım Ortamları
Yazılım geliştirilen ortamlar serbest değil. Bilgisayarlar genellikle internete bağlı değil. Bu yüzden X aracını, kütüphanesini vs. intranet ortamına aldırmak, bir şey kurdurmak için uğraşmanız gerekiyor. 

Bu konuda da oldukça şikayet var. 

3. Kazanç
Son yıllarda artık iyice zirveye çıkan bir yurt dışına gitme veya uzaktan çalışma furyası var. Sebep basit. Yurt dışında daha fazla kazanç var. Tecrübeli bir çok yazılımcı Savunma Sanayii şirketlerinden çıktı. Çoğu şirkette artık yetersiz sayıda tecrübeli yazılımcı var.

Şirketler mecburen açığı yeni mezunlarla doldurmaya çalışıyorlar. Tabii bunun da başka etkileri oluyor. Örneğin bir işi bilen adam ayrılmış ve arkasında hiç belge bırakmamış olabiliyor. Bu durum yeni gelenler için hiç hoş değil.

4. Çalışma Ortamı
Bu madde aslında benim için önemli değil, ancak bu sektörden ayrılmaya karar veren pek çok insandan duyduğum için yazıyorum. 

Yazılımcılar ve özellikle yeni Z kuşağı, çok daha farklı şeyler istiyor. Esnek ve rahat çalışma ortamı, sosyal imkanlar gibi. Savunma Sanayiinde bu şartlar çok daha kısıtlı oluyor. Esnek mesai vs denilse de giriş çıkışlar kayıt altında ve mesainizi tamamlamanız gerekiyor. 





25 Ağustos 2021 Çarşamba

gRPC Load Balancing

Giriş
Açıklaması şöyle.
There are two types of load balancing options available in gRPC — proxy and client-side.
1. Proxy load balancing
2. Client-side load balancing
Proxy load balancing
Bir gRPC servisi istekleri karşılar, diğer gRPC servislerine dağıtır. Açıklaması şöyle.
In Proxy load balancing, the client issues RPCs to a Load Balancer (LB) proxy. The LB distributes the RPC call to one of the available backend servers that implement the actual logic for serving the call. The LB keeps track of load on each backend and implements algorithms for distributing load fairly. The clients themselves do not know about the backend servers. Clients can be untrusted. This architecture is typically used for user-facing services where clients from open internet can connect to the servers
Client-side load balancing
gRPC istemcisi gRPC servislerini bilir ve isteği kendi uygun gördüğü birine gönderir. Açıklaması şöyle.
In Client-side load balancing, the client is aware of many backend servers and chooses one to use for each RPC. If the client wishes it can implement the load balancing algorithms based on load report from the server. For simple deployment, clients can round-robin requests between available servers.
Client-side load balancing ve Kubernetes
Açıklaması şöyle. Yani gRPC  bir Connection Pool kullansaydı ve bağlantıları arada bir kapatıp tekrar açsaydı sorun olmayacaktı. Ancak gRPC bağlantıyı hep açık tutmak üzere tasarlanmış. Çözüm Serve-side Connection Management kullanmak
gRPC is built on HTTP/2, and HTTP/2 is designed to maintain a long-living TCP connection where all requests can be active on the same connection at any point in time. It reduces the overhead of connection management. ... once the connection is established, there’s no more balancing to be done. All requests get pinned to original destinations pods, as shown below until a new DNS discovery happens (with headless service). And it won’t happen until at least one of the existing connections breaks.
Serve-side Connection Management
Örnek
Şöyle yaparız
grpc.KeepaliveParams(keepalive.ServerParameters{
  MaxConnectionAge:      time.Second * 30,  // THIS one does the trick
  MaxConnectionAgeGrace: time.Second * 10,
})
Açıklaması şöyle
MAX_CONNECTION_AGE to 30 seconds. This time period is long enough to have low-latency communication without an expensive and frequent connection establishment process. Also, it allows services to react relatively quickly to the existence of new pods so the traffic distribution will be balanced.

MAX_CONNECTION_AGE_GRACE to 10 seconds. Defines the maximum time for the connection to be kept alive for outstanding RPCs to complete.


DO-178B/C Seviyeleri

Giriş
Bu yazı DO-178B içinde bir bölümdü, ancak daha sonra uzunca bir bölüm olunca tek başına bir yazı haline getirmeye karar verdim. Açıklaması şöyle
Let’s take a look at Software Safety Levels.

DO-178B introduced (and DO-178C continued to use) the fundamental concept of the Design Assurance Level (DAL).

The DAL levels range from A-E.

These define the amount of rigor that should be applied by the design assurance process based on the contribution to Aircraft Safety.

The higher the DAL (i.e. DAL A is the highest), the more activities and objectives that must be performed and met as part of the Design Assurance process because of the more severe consequences to the aircraft should the software fail or malfunction.

Put into plain English : “You want your flight control software checked far more thoroughly than your in-flight entertainment system!”

For example looking at DAL A software there are 71 objectives to be met, vs 62 objectives to be met at DAL C.
DO-178B/C süreçlerinde A/B/C/D/E olmak üzere farklı hedefler ortaya koyan 5 farklı seviye var. Süreçlerin emniyet önceliklerinin gösteren tablo aşağıda.

Her seviyenin Objectives ve Verification Objectives sayısı şeklen şöyle


Kelimelerin Türkçeleri şöyle:
Catastrophic : Ölümcül
Hazardous/Severe-Major : Tehlikeli
Major : Önemli
Minor : Az önemli
No Effect : Etkisiz

Aynı yazılım büyük bir uçakta Level A iken daha küçük bir uçakta Level B olabilir. Seviyeler tamamen maliyet ve can kaybı sayısı ile ilgili. Örneğin Boeing büyük bir uçaktaki yazılıma çok para harcayıp Level A yapsa sıkıntı olmaz. Ancak aynı maliyeti küçük bir uçağa yüklese uçak tercih edilmez. Bu yüzden hangi seviye olması gerektiği maliyet ve kaza anındaki can kaybı sayısı ile ilgili.

Not : Seviye E olarak örnek gösterilen Eğlence Sistemi (Entertainment System) yavaş yavaş on-board veya internet üzerinden streaming media yöntemine dönüyor. Gelecekte halen Seviye E olarak sınıflandırılacağından emin değilim.

Bu seviyelerin yolcu, mürettebat ve araç üzerindeki etkilerini gösteren EASA CS-25 şekli şöyle

Catastrophic seviyede "Hull Loss" şu anlama geliyor. Yani mutlaka aracın gövdesini tahrip olması demek değil, ancak bunun gerçekleşmesi çok olası
Hull Loss is typical for this type of failure. But it is also possible (although more rare) to have a catastrophic incident without hull loss.

23 Ağustos 2021 Pazartesi

HTTP Live Streaming - HLS

HLS - HTTP Live Streaming
Şeklen şöyle. Burada verinin merkezi bir sunucu üzerinden aktığı görülebilir. Apple tarafından geliştirilen HLS, Flash'ın yerine geçti. Tarayıcı, televizyon ve telefonlarda çalışabilir.

Açıklaması şöyle.
HLS Technical Specifications
Audio Codecs: AAC-LC, HE-AAC+ v1 and v2, xHE-AAC, Apple Lossless, FLAC.
Video Codecs: H.265, H.264.
Playback Compatibility: It was created for iOS devices, but is now supported  by: all Google Chrome browsers; Android, Linux, Microsoft, and macOS devices; several set-top boxes, smart TVs, and other players. 
Benefits: Supports adaptive bit rate, it's reliable, and it's widely supported.
Drawbacks: Video quality and viewer experience are prioritized over latency.
Latency: HLS allows us to have 5-20 seconds of latency, but the Low-Latency HLS extension has now been incorporated as a feature set of HLS, promising to deliver sub-2-second latency.
Adaptive Streaming Nedir?
Açıklaması şöyle. Yani videonun farklı kalitelere göre daha küçük parçalara ayrılması ve gereken kalitedeki parçanın gönderilmesi
We then break the video into multiple small chunks; the resulting format will be an adaptive bitrate streaming format. 
HLS ve Adaptive Streaming
Şeklen şöyle

Açıklaması şöyle
HLS works like all adaptive streaming technologies. Multiple files are created for distribution to the player, which can adaptively change streams to make the viewer’s experience “perfect.” Since it is an HTTP-based technology, no streaming server is required, so all adjustments are made on the player device.

To distribute to HLS clients, the source is encoded into multiple files at different data rates and divided into short chunks (segments of data) which are usually around 10 seconds long. This process is also called segmented delivery. These are loaded onto an HTTP server along with a text-based manifest file with a .M3U8 extension that directs the player to additional manifest files for each of the encoded streams.

Segmented delivery allows the player to shift between different video qualities depending on available resources of the viewers’ conditions, while also driving down latency.
HLS vs MPEG-Dash
Açıklaması şöyle. Yani MPEG-Dash bir başka seçenek
There are different standards for adaptative bitrate streaming, like HLS or MPEG-Dash. The first one, HLS, is developed by Apple and is native on IOS. The Moving Pictures Group created the second one, MPEG-Dash, as an alternative to HLS.

Low-Latency HLS Nedir?
Açıklaması şöyle.
Low-Latency HLS extends the protocol to enable low-latency video streaming while maintaining scalability. The new low-latency mode lowers video latencies over public networks into the range of standard television broadcasts.
HLS vs WebRTC 
Eğer latency önemliyse, WebRTC kullanmak gerekir.. Eğer video kalitesi önemliyse HLS kullanmak gerekir.

17 Ağustos 2021 Salı

Replace Conditional Refactoring

Giriş
Replace Conditional Refactoring için bir kaç çözüm var.

1. Map Kullanmak. if-else konfigürasyon içinse bu bilgiyi bir veri yapısı içine doldurarak arama yapmak şeklinde oluyor.

2. Polymorphism Kullanmak

3. Early Return Kullanmak

4. if-else bloklarını tek bir döngü içine almak, 

5. reflection kullanmak

Örnek - Konfigürasyon 
Elimizde şöyle bir kod olsun
fun getCurrencyNameOf(country: String): String {
  return if (country == "India") {
    "Rupee"
  } else if (country == "USA") {
    "Dollars"
  } else if (country == "UK") {
    "Euro"
  } else if (country == "Japan") {
    "Yen"
  } else if (country == "China") {
    "Yuan"
  } else {
    "NA"
  }
}
Bu kodu şu hale getiririz
class Currency {
  val map = HashMap<String, String>();
  
  init {
    map.put("India", "Rupee")
    map.put("UK", "Euro")
    map.put("Japan", "Yen")
    map.put("USA", "Dollar")
    map.put("China", "Yuan")
  }


  fun getCurrencyNameOf(country: String): String {
    return map.get(country) ?: "NA"
  }
}

Örnek - Polymorphism
Bu örneğin adı "Replace Conditional With Polymorphism Refactoring". Klasik bir refactoring örneğidir.

Elimizde bir şekil hiyerarşimiz olsun. Her şekil için alan hesaplamak isteyelim. Eğer CalculateArea() metodu ana sınıfta ise, yeni bir şekil tipi eklemek istediğimizde, ana sınıfı da değiştirmemiz gerekir. Bu durumda SOLID - Open-Closed Principle kuralını ihlal ederiz.
public double CalculateArea()
{
  switch(BoxType)
  {
    case BoxType.Rectangle:
      return Width * Height;
    case BoxType.Square:
      return Width * Height; 
    case BoxType.Circle:
      return Radius * Math.PI;
    default: return 0;
  }
}

Amazon Web Service (AWS) Elastic Compute Cloud (EC2) - Donanım Sağlar

Giriş
Açıklaması şöyle. Yani donanım sağlar gibi düşünülebilir.
Amazon Elastic Compute Cloud (EC2) lets you easily provision and scale infrastructure resources, on-demand. The main resource EC2 provides is called an EC2 instance, which is essentially a virtual server provisioned in the AWS cloud. There is a wide range of EC2 instance types, each providing different CPU, storage, network capacity, and memory. 

EC2 integrates natively with AWS monitoring tools, as well as with Elastic Load Balancing and Auto Scaling, which help you optimize usage and costs.
Açıklaması şöyle
The core of the web of AWS is EC2. You can think of this as a service that provides servers where your applications will be running.
EC2 Instance Çeşitleri yazısına bakabilirsiniz

EC2 Dashboard
Soldaki bazı menüler şöyle
Events — It may include planned activities that are being carried out by AWS in a particular region.
Tags — You assign tags to your resources in AWS to easily filter and manage them. In EC2 you can assign tags to your instances, EBS volumes, Elastic Load Balancers, Snapshots, AMIs, etc. You can see all those tags here.
Reports — Here you can see your cost and usage reports for your EC2 usage. You can use these reports to analyze and optimize your resource usage.
Limits — This shows you your EC2 resource limits like Instance Limits (Number of instances you can launch), EBS Limits (Amount of storage in TiB you can provision), etc.
Instances menüsü şöyle
Instances —This shows you all the details of your running and stopped instances.
Launch Templates — Create a template that specifies the instance configuration, permissions, best practices and use it to automatically launch instances using autoscaling and EC2 fleet.
Spot Requests — In EC2 you can launch spot instances for non-critical tasks. These instances offer up to 90% discount as compared to On-demand instances. You can see the status of your spot requests here.
Reserved Instances — ...
Kullanım
Şöyle yaparız
This section will provide details about the AWS Setup to get your EC2 instance up and running.

- Login into the AWS Console > Navigate to the EC2 Service Dashboard
- Goto the Security Group > Create a new security-group “web-access-security-group” with Inbound Rules for SSH, HTTP and HTTPS. You can name the group whatever you want.
- Go back to EC2 DashBoard -> Launch Instance Wizard
- Select the Amazon Linux AMI — You choose which ever distribution works for you.
- Name the EC2 Instance — StudentAppWebServer
- You can keep the instance type to t2.micro. Depending on the requirement, you can select the appropriate type for your application.
- Select/Generate a key pair — This is very important as this will be required to SSH into the instance.
- Select Existing Security Group — web-access-security-group
- You can choose to modify the VPC as per your convenience but I will be using the default to demonstrate this setup.
- Keep rest of the settings as default and “Launch Instance”
- Once this is done you will see an instance running on your instances view dashboard.
- Click on the instance, and go to the details. Copy the PUBLIC IP associated to the instance. This will be used to SSH into the instance.
Bu Linux'a ssh açmak için şöyle yaparız
# Navigate to the key pair and modify the permissions if not done already.
# If the permissions is set to 644 then you will be denied to ssh into the instance.
> chmod 600 <key-pair.pem>

# SSH into the instance. Username changes on the basis of the image you are using. 
> ssh -i /path/keypair.pem ec2-user@<Instance-Public-IP>
Launch Instance Penceresi
Adımlar şöyle
1. Login to the AWS console
2. Switch to Services -> EC2 -> Launch Instance
Şeklen şöyle

Instance Type ve Create New Key Pair Penceresi
Şeklen şöyle. Burada t2.medium seçili

New Security Group Penceresi
Şeklen şöyle.
Eğer VPC ile yaratılmış security group varsa onu seçmek için şöyle yaparız

Configure Storage Penceresi
Şeklen şöyle.

Summary Penceresi
Şeklen şöyle.


Instances Penceresi
Şeklen şöyle.

Bir tanesini seçeriz. Şeklen şöyle.
Şeklen şöyle.. SSH Client sekmesine geçersek, tarayıcı içinde bir terminal çalışmaya başlar.




Örnek - Lightsail
Açıklaması şöyle
Amazon Lightsail, launched in 2016, is essentially a virtual private server (VPS) that offers you everything needed to deploy an application or website in a cost-effective and easy-to-understand manner. It is a basic service, but extremely convenient.

It is designed for customers, developers, small businesses, or startups to get quickly started in AWS. It reduces the learning curve in the beginning, and users can later adopt the broad AWS Services as they get more familiar with the AWS cloud and/or solution workload increases.

Under the hood, Lightsail is powered by Amazon EC2, Application Load Balancer (ALB), and other AWS services. By doing this, it offers the level of security, reliability, and scalability you are expecting from AWS.
EC2 Payment Models
Açıklaması şöyle
There are six possible ways to define your payment model for Amazon EC2 instances:

1. On-Demand – which is the most flexible one, but the most expensive-looking in a long run
2. Compute Savings Plans – are the most flexible out of the saving plans, with cost reduction up to 66%. With this plan it’s possible to change compute instances from one type to another, also apply different sizes and shift workloads from one region to another, or even move from EC2 to Fargate or Lambda. All within the same plan.
3. EC2 Instance Savings Plans – this plan costs the least, with cost reductions of up to 72%. But you need to commit to an individual instance type in a region. In the region, you have the flexibility to change usage within the same family instance.
4. Reserved Instances
- Standard RI – capacity reservations that recur on a daily, weekly, or monthly basis. Typically provide the highest discount levels.
- Convertible RI – if you don’t have a good understanding of your long-term requirements you can choose Convertible RI, as they enable you to change the instance family and other parameters associated with a Reserved Instance at any time, as many times as you need. They offer a significant discount (typically 45% compared to On-Demand).
5. Spot Instances – unused EC2 instances that run whenever capacity is available and can be purchased for a smaller price than the On-Demand instances. You can see pricing options here.
EC2 ve EBS Storage
EC2'ye EBS depolama ilave edilebilir. Açıklaması şöyle
You can also add block storage volumes to each instance. Amazon Elastic Block Storage is designed for use with EC2 for throughput and transaction-intensive workloads, such as relational and non-relational databases, containerized applications, file systems, and more.
Dosya Kopyalama
Örnek
Şöyle yaparız
# Format scp -i <path to key pair> <jar file path> ec2-user@<public DNS of EC2>:<destination path> # Example scp -i Desktop/ec2-key-pair.pem Desktop/demo-1.0-SNAPSHOT.jar \ ec2-user@ec2-44-71-215-49.compute-1.amazonaws.com:~
Aynı şeyi bash haline getirmek için şöyle yaparız
#!/bin/bash
echo "Source Origin: $1"
echo "Connecting to $2"
scp -i ec2-key-pair.pem $1 ec2-user@$2.compute-1.amazonaws.com:~
Dosyaya hak veririz
chmod u+x aws-copy.sh
./aws-copy.sh Desktop/demo-app.jar ec2-12-12-12-12
EC2 shell
Örnek
Şöyle yaparız
# Format
ssh -i <path to key pair> <jar file path> ec2-user@<public DNS of EC2>:~
ssh -i Desktop/ec2-key-pair.pem ec2-user@ec2-44-71-215-49.compute-1.amazonaws.com
Aynı şeyi bash haline getirmek için şöyle yaparız
#!/bin/bash
echo "Connecting to $1"
ssh -i Desktop/ec2-key-pair.pem ec2-user@$1.compute-1.amazonaws.com
./aws-ec2.sh ec2-12-12-12-12


16 Ağustos 2021 Pazartesi

HAProxy

HAProxy + PgBouncer
Şeklen şöyle


/etc/haproxy/haproxy.cfg Dosyası
Örnek
Şöyle yaparız. listen stats alanında özet görmek için 7000 portunun kullanılacağı belirtiliyor.. 
http://45.58.47.24:7000 adresine gideriz.
global
    maxconn 100

defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode http
    bind *:7000
    stats enable
    stats uri /

listen postgres
    bind *:5000
    option httpchk
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgresql_69.87.217.177_5432 69.87.217.177:5432 maxconn 100 check port 8008
    server postgresql_45.58.39.238_5432 45.58.39.238:5432 maxconn 100 check port 8008

12 Ağustos 2021 Perşembe

Redis RediSearch - Secondary Index İçindir

Giriş

Açıklaması şöyle
Redis has a versatile set of data structures ranging from simple Strings all the way to powerful abstractions such as Redis Streams. The native data types can take you a long way, but there are certain use cases that may require a workaround. One example is the requirement to use secondary indexes in Redis in order to go beyond the key-based search/lookup for richer query capabilities. Though you can use Sorted Sets, Lists, and so on to get the job done, you’ll need to factor in some trade-offs.

Available as a Redis module, RediSearch provides flexible search capabilities, thanks to a first-class secondary indexing engine. Some of its key features include full-text search, auto completion, and geographical indexing.
Açıklaması şöyle
Two of the most important commands include creating an index and executing search queries:
FT.CREATE is used to create an index with a given schema and associated details.
FT.SEARCH searches the index with a textual query, returning either documents or just ids.

You can execute other operations on indices:
FT.DROPINDEX deletes the index. Note that by default, it does not delete the document hashes associated with the index
FT.INFO returns information and statistics on the index such as number of documents, number of distinct terms and more.
FT.ALTER SCHEMA ADD adds a new field to the index. This causes future document updates to use the new field when indexing and re-indexing of existing documents.

To work with auto-complete features, you can use “suggestions”:
FT.SUGADD adds a suggestion string to an auto-complete suggestion dictionary.
FT.SUGGET gets completion suggestions for a prefix.

RediSearch supports synonyms which is a data structure comprised of a set of groups, each of which contains synonym terms. FT.SYNUPDATE can be used to create or update a synonym group with additional terms.

If you want query spell check correction (similar to “did you mean” feature), you can use FT.SPELLCHECK which performs spelling correction on a query, returning suggestions for misspelled terms.

A dictionary is a set of terms. Dictionaries can be used to modify the behavior of RediSearch’s query spelling correction, by including or excluding their contents from potential spelling correction suggestions. You can use FT.DICTADD and FT.DICTDEL to add and delete terms, respectively.

Redis Stream Veri Yapısı - Persistent Pub/Sub

Giriş
Stream işleri için JedisPool Sınıfı kullanılır. Understanding Redis Streams yazısına bakılabilir

Açıklaması şöyle.
Redis, meanwhile, recently announced its new data structure, called " Streams," for managing streaming data. Redis Streams offers asynchronous communication between producers and consumers, with additional features such as persistence, look-back queries, and scale-out options — similar to Apache Kafka. In essence, with Streams, Redis provides a light, fast, easy-to-manage streaming database that benefits data engineers.
Persistency vardır. Açıklaması şöyle
Introduced in Redis 5.0, Redis Streams provides the best of Pub/Sub and Lists along with reliable messaging, durability for messages replay, Consumer Groups for load balancing, Pending Entry List for monitoring and much more! What makes it different is that fact it is a append-only log data structure. In a nutshell, producers can add records (using XADD), consumers can subscribe to new items arriving to the stream (with XREAD). It supports range queries (XRANGE etc.) and thanks to consumer groups, a group of apps can distribute the processing load (XREADGROUP) and its possible to monitor its state (XPENDING etc).
Consumer Group'lar şeklen şöyle
Bir başka şekil şöyle. Bu kullanımla aynı Kafka'ya benziyor.

Açıklaması şöyle
Redis Streams messages are string key/values in Java.

Read entries
Açıklaması şöyle
XRANGE
returns the stream entries matching a given range of IDs (the - and + special IDs mean respectively the minimum ID possible and the maximum ID possible inside a stream)
XREVRANGE
is exactly like XRANGE, but with the difference of returning the entries in reverse order (use the end ID first and the start ID later)
XREAD
reads data from one or multiple streams, only returning entries with an ID greater than the last received ID reported by the caller.
XREADGROUP
is a special version of the XREAD command with support for consumer groups. You can create groups of clients that consume different parts of the messages arriving in a given stream
Write Entries
XADD : Yeni veri ekler


Manage Redis Streams
Açıklaması şöyle
XACK
removes one or multiple messages from the Pending Entries List (PEL) of a stream consumer group.
XGROUP
is used to manage the consumer groups associated with a Redis stream.
XPENDING
is the used to inspect the list of pending messages to observe and understand what is happening with a streams consumer groups.
XCLAIM
is used to acquire the ownership of the message and continue processing.
XAUTOCLIAM
transfers ownership of pending stream entries that match the specified criteria. Conceptually, XAUTOCLAIM is equivalent to calling XPENDING and then XCLAIM
Delete
Açıklaması şöyle
XDEL
removes the specified entries from a stream, and returns the number of entries deleted, that may be different from the number of IDs passed to the command in case certain IDs do not exist.
XTRIM
trims the stream by evicting older entries (entries with lower IDs) if needed.
Örnek
Stream kullanmak için bir örnek burada.

IEEE 802.11

802 Sayısı Nereden Geliyor.?
802 LAN/MAN Standartları komitesi için kullanılan numara. Faal şu komiteler var. Bunun dışında kapatılmış ve 802 ile başlayan başka komiteler de mevcut.
  • 802.1 Higher Layer LAN Protocols Working Group
  • 802.3 Ethernet Working Group
  • 802.11 Wireless LAN Working Group
  • 802.15 Wireless Personal Area Network (WPAN) Working Group
  • 802.16 Broadband Wireless Access Working Group
  • 802.18 Radio Regulatory TAG
  • 802.19 Wireless Coexistence Working Group
  • 802.21 Media Independent Handover Services Working Group
  • 802.22 Wireless Regional Area Networks
  • 802.24 Vertical Applications TAG
  • 802 5G/IMT-2020 Standing Committee
802.11 Ailesi
Ailenin tarihçesi şöyle
3.1 802.11-1997 (802.11 legacy)
3.2 802.11a (OFDM waveform)
3.3 802.11b
3.4 802.11g
3.5 802.11-2007
3.6 802.11n
3.7 802.11-2012
3.8 802.11ac
3.9 802.11ad
3.10    802.11af
3.11    802.11-2016
3.12    802.11ah
3.13    802.11ai
3.14    802.11aj
3.15    802.11aq
3.16    802.11ax
3.17    802.11ay

802.11a
1999 yılında çıktı. Sadece 5 GHz'de OFDM ile çalışır. Teoride 54, pratikte ise 20 Mbps civarında throughput verir.

802.11b - Eski Teknoloji
1999 yılında 802.11a ile beraber çıktı. 2.7 GHz'de çalışır. 11 Mbps civarında throughput verir. Bu cihazların daha yeni cihazları da yavaşlattıkları söyleniyor.

802.11g
2003 yılında çıktı. Sadece 2.4 GHz'de OFDM ile çalışır. 54 Mbps civarında throughput verir. Açıklaması şöyle
Older devices, such as 802.11g, these did not use MIMO. When these devices had two antennas, it was for diversity. In other words, it only used one antenna, but it could switch between which antenna it used to try to get a better signal.
802.11b istemcilerinin 802.1g'ye bağlanması engellenebilir. Açıklaması şöyle
The goal of all this is to reduce channel utilization by removing low rates (and the channel inefficiencies of 11b clients). By forcing clients to use higher data rates, they spend less time transmitting and receiving, and therefore free up the channel for other clients.
802.11n
2009 yılında çıktı. 2.4 (opsiyonel) ve 5 GHz'de OFDM ile çalışır. 300 Mbps civarında throughput verir. 802.11n zaten 802.11a aynı frekansı kullandığı için birlikte çalışır. Eğer cihaz dual band ise 802.11g ile de çalışabilir. 802.11n cihazların bazı kanalları özel. Açıklaması şöyle.
5 GHz channels 36, 40, 44 and 48 are the only channels that can be used without radar detection, power control etc, indoors, world-wide (well, almost).
802.11n standardının en önemli parçalarından birisi Multiple Input and Multiple Output yani MIMO'dur. MIMO wifi cihazlar çift anten kullandıkları için bağlanan cihaza göre sinyali en kaliteli seviyeye getirebilirler. Açıklaması şöyle
802.11n access points make use of MIMO and multiple spatial streams. As such, each antenna is dedicated to one spatial stream (i.e. antenna 1 = first spatial stream, antenna 2 = second spatial stream, etc). The second spatial stream is only used in conjunction with the first spatial stream at higher data rates, it doesn't function independently.

802.11ac - Yeni teknoloji 5G İçindir
2011 yılında çıktı. 5 GHz'de çalışır. 1 Gbps civarında throughput verir. Bu da MIMO kullanır. Açıklaması şöyle
The reason you have 2 antennas is to enable the MIMO/beamforming/multiple concurrent transmissions capabilities as defined by 802.11ac
Açıklaması şöyle
5G wireless network is the latest mobile technology based on the IEEE 802.11ac wireless networking standard.

802.11ah - Yeni teknoloji
Açıklaması şöyle. Klasik Wifi'da güç tüketimine önem verilmez. Bu sürüm ile daha az güç tüketimi amaçlanıyor.
...they announced 802.11 AH which they’ve branded as HaLow, which attempts to address power, range, and pairing concerns of classic WiFi.
802.11p
Araba radarlarında kullanılıyor. Otonom sürüş ve frenleme sistemlerine besleme sağlar.

802.11 ve Şifre
802.11 ve Şifre yazısına taşıdım.

802.11 ve Frame Yapısı
802.11 Mac Frame Header yazısına taşıdım.

11 Ağustos 2021 Çarşamba

Programlama Dillerinde Dependent Typing Nedir?

Giriş
Çoğu programlama dili generics/template kullanımına izin veriyor. Dependent Typing  ise bundan bir adım ileride. Açıklaması şöyle
A language is called dependently typed if it also offers the possibility of defining functions from values to types. Or in other words, parameterizing a type definition over a value
- Template Type olarak bir değer kullanılmasına izin veriyor. 
- Ayrıca iki tane aynı tipin ayrımını da yapabiliyor

Örnek
Elimizde şöyle bir kod olsun
typedef std::map<int,int> IIMap;
IIMap foo;
IIMap bar;
Şu kod derlenir ancak aslında mantıken hatalıdır
IIMap::iterator i = foo.begin();
bar.erase(i);
Dolayısıyla tam anlamıyla Dependent Typing olan bir dilde bu kodun hata vermesi gerekir.
foo.iterator i = foo.begin();
bar.erase(i);  // ERROR: bar.iterator argument expected
C++
Kısmen Dependent Typing desteği vardır. Örneğin template parametresi olarak bir sayı geçilebilir.

Java
Dependent Typing desteklemez. Dolayısıyla şöyle bir kod derlenmez
/** 
 * String of a certain length n and a method to reduce to length n-1 
 */
public class StringN<int n> {
  private String str;
  public StringN (String str) {
    if (str.length() != n) {
      throw new IllegalArgumentException("string is not of required length!");
    }
    this.str = str;
  }

  public StringN<n-1> reduce() {
    return new StringN<n-1>(s.substring(0, s.length() - 1));
  }

  @Override
  public String toString() {
    return str;
  }
}