27 Ağustos 2014 Çarşamba

Hücum Açısı

Kaldırma Teorisi - Theory of Lift
Kaldırma kuvveti iki ana teori ile açıklanıyor.

Hücüm Açısı Nedir - Theory of lift from equal transit
Hücum açısı (Angle of attack) nasıl işler konusunda aldığım notları paylaşıyorum. Kendi alanım olmadığı için anladığım kadarını yazabildim.

Kanadın altından n üstünden ise yine n tane molekül geçtiğini varsayalım. Kanadın üst yüzeyi daha geniş bir alana sahip olduğu için moleküller daha seyrek dizilirler. Bu yüzden alt kanattaki moleküller üst tarafa ilerlemek ister ve bir kaldırma kuvveti oluşur.

Kanadın ön tarafına hücum kenarı (leading edge) arka tarafına ise firar kenarı (trailing edge) denilir.

Alpha Vane
Hücum Açısını ölçmek için Alpha Vane kullanılır. Angle of Attack Vane (AOV) olarak ta isimlendirilir.

Theory of Air Deflection
Konuyu açıkla.

24 Ağustos 2014 Pazar

MIL-STD-498 SDP

Software Development Plan
Software Development Plan (SDP) - Yazılım Geliştirme Planı - içinde plan kelimesi geçtiği için geleceğe yönelik faaliyetlerin tarihlerini içeren bir belge gibi anlaşılyor. Ancak İngilizce'de plan kelimesi bir işin nasıl yapılacağını tarifleyen belgeler için de kullanılıyor. SDP yazılımın nasıl geliştirileceğini anlatır.

Bir çok süreçte SDP belgesi bulunur. MIL-STD-498 SDP belgesi içinde aşağıdakine benzer başlıklar olur.

1. Scope - Kapsam
  1.1 Identification - Kimlik
  1.2 System Overview - Sisteme Genel Bakış
  1.3 Document Overview - Dokümana Genel Bakış
  1.4 Relationship to Other Plans - Diğer Planlarla İlişkiler
2. Referenced Documents - Referans Dokümanlar
  2.1 Applicable Documents - Uygulanabilir Dokümanlar
  2.2 Reference Documents - Referans Dokümanlar
3. Overview of Required Work - İşlere Genel Bakış
4. Plans for Performing General Software Development - Genel Yazılım Geliştirme Faaliyetler Planları
  4.1 Software Development Process - Yazılım Geliştirme Süreci
  4.2 General Plans for Software Development - Yazılım Geliştirme İçin Genel Planlar
    4.2.1 Software Development Methods - Yazılım Geliştirme Yöntemleri
    4.2.2 Standards for Software Products - Yazılım Ürünleri için Standartlar
    4.2.3 Reusable Software Products - Tekrar Kullanılabilir Yazılım Ürünleri
    4.2.4 Handling of Critical Requirements - Kritik Gereksinimlerin Ele Alınması
    4.2.5 Computer Hardware Resource Utilization - Bilgisayar Donanımı Kaynak Kullanımı
    4.2.6 Recording Rationale - Karar Gerekçelerinin Kaydedilmesi
    4.2.7 Access for Acquirer Review - Müşteri Erişiminin Sağlanması
5. Plans for Performing Detailed Software Development - Detaylı Yazılım Geliştirme Faaliyetleri Planları
 5.1 Project Planning and Oversight - Proje Planlama ve Gözetim
 5.2 Establishing a Software Development Environment - Yazılım Geliştirme Planlaması
 5.3 System Requirements Analysis - Sistem Gereksinimleri Tanımlaması
 5.4 System Design - Sistem Tasarımı
 5.5 Software Requirements Analysis - Yazılım Gereksinimlerinin Tanımlaması
 5.6 Software Design - Yazılım Tasarımı
 5.7 Software Implementation and Unit Testing - Yazılım Kodlama ve Birim Testleri
 5.8 Unit Integration Testing - Birim Entegrasyonu Testleri
 5.9 CSCI  Qualification Testing - Yazılım Yeterlilik Testleri
 5.10 System Integration Testing - Sistem Tümleşim Testleri
 5.11 System Qualification Testing - Sistem Yeterlilik Testi
 5.12 Software Use - Yazılımın Kullanım İçin Hazırlanması
 5.13 Software Transition - Yazılımın Devredilmesine Hazırlık
 5.14 Software Configuration Management - Yazılım Konfigürasyon Yönetimi
     Buraya göz atabilirsiniz.
 5.15 Software Product Evaluation - Yazılım Ürün Değerlendirmesi
 5.16 Software Quality Assurance - Yazılım Kaliye Güvencesi
 5.17 Problem Resolution - Düzeltici Faaliyetler
 5.18 Joint Technical and Management Reviews - Müşterek Teknik ve Yönetim Gözden Geçirmeleri
 5.19 User Training - Kullanıcı Eğitimi
 5.20 Other Software Development Activities - Diğer Yazılım Geliştirme Faaliyetleri
6. Schedules and Activities: 
  Takvim tahmininde adam/ay kullanılır. Adam/ay tahmininde Mythical Man Month kitabına mutlaka göz atmak gerekir.

7. Project Organization and Resources - Proje Organizasyonu ve Kaynaklar
 7.1 Proje Yöneticisi
 7.2 Proje Sistem Mühendisi
 7.3 Proje Yönetim Uzmanı
 7.4 Lider Test Mühendisi
 7.5 Test Mühendisi
 7.6 Lider Yazılım Mühendisi
 7.7 Yazılım Mühendisi
 7.8 Kalite Güvence Uzmanı
 7.9 Konfigürasyon Yönetim Uzmanı
 7.10 Sözleşme Yöneticisi
 7.11 Tedarik ve Teklif Yöneticisi. Teklif hazırlanırken teklif yöneticisi ve teknik çözümü hazırlayan kişiler çalışırlar.

Bu bilgiler Proje Yönetim Planında da bulunabilir. Varsa sadece atıfta bulunmak yeterlidir.
8 Notes - Notlar


23 Ağustos 2014 Cumartesi

Scalar Ne Demektir

Scalar Ne Demektir?
Scalar bir çok yerde karşımıza çıkan bir kelime. Anlam olarak bir tane sayı demektir. Sayı integral veya floating point olabilir.

Bu kavram Lineer Cebirden gelir. Tek başına bir sayıyı dizi, matris, vektor gibi kavramlardan ayrıştırır

Shell ve TTY

Linux
Terminal Uygulamaları
Shell (Kabuk) İle başlatılan uygulamalar TTY ile otomatik olarak ilişkilendirilir. Aşağıdaki şekli buradan aldım ve zaten durumu çok güzel özetliyor.
Dolayısıyla shell (kabuk) tarafından başlatılan her terminal programı shell ile ilişkili olan TTY'yi devralır ve kendisi de aynı TTY arayüzünü kullanmaya başlar. Örnek olarak grep komutunu çalıştırırsak grep uygulamasına onu başlatan kabuğun kullandığı TTYcihazı input,output ve error file descriptorları olarak geçilir.

Grafik Arayüzü Kullanan Uygulamalar
Terminalden başlatılan grafik programları da TTY ile ilişkilendiriliyor. Hatta bu durumda GUI uygulamasında kullanılan printf, cout gibi komutların çıktıları da görülebiliyor.

Windows
Grafik Arayüzü Kullanan Uygulamalar
Console Metodları başlıklı yazıya taşıdım.

Grafik Arayüzü Kullanan Uygulamalara Pipe ile Veri Girmek
Yine aynı şekilde TTY olmadığı için pipe ile girdi vermek te mümkün değil. Aşağıda biraz el emeği gerektiren bir yöntem varç

clip komutu
clip komuyu veriyi biriktirebilir. Örnekte iki dosyanın farkını bulunup clip komutu içinde biriktiriliyor. notepad çalıştırılıp veri Ctrl + V ile notepad'e yapıştırılır.

diff file1.txt file2.txt | clip && notepad



Gömülü Proje - HashMap HashSet

Giriş
Bir çok programlama dilinde HashMap, HashSet gibi veri yapıları hazır geliyor. Gömülü ortamlarda ise bu veriyapılarını kodlamak gerekebiliyor. Aşağıda bu tür veriyapılarını geliştirirken aldığım notlar var

HashMap
Mükemmel hash fonksiyonu olmadığı için iki farklı değerin aynı hash sonucunu üretmesi çok mümkün. Bu durumda Çarpışma Çözümü (Collision Resolution) yapmak gerekiyor. Çözüm olarak iki farklı yöntem yaygınca kullanılıyor. İlki Open Addressing ve Separate Chaining.

OpenAddressing
Bu yöntem lookup tablosu gibi salt okunur veriyapılarında kullanışlı. Eğer bucket dolu ise bir sonraki boş bucket aranır. Kodlaması kolaydır. HashMap bucket büyüklüğü yeterince büyük tutulursa çok fazla çakışma olmayacağı için performansı da iyidir.

Separate Chaining
Bu yöntem eğer veriyapısı salt okunur değilse tercih etmek lazım. Ekleme silme işlemlerini daha iyi yerine getirir. Hash metodunun denk geldiği bucket bir LinkedList tutar. Yeni veri liste üzerinde yürünerek sona eklenir. Çarpışma Çözümü (Collision Resolution) için ikili ağaç (binary tree) kullanılabileceği de yazılı ancak ben hiç denk gelmedim.

HashSet
HashSet -> Buckets ->LinkedList ->ListNode şeklinde Separate Chaining kullanılır. Eğer Object Oriented bir yöntem izlenirse nesnenin HashValue() ve Equals metodları da olması beklenir.


22 Ağustos 2014 Cuma

Unit Test Description

Unit Test Description (UTD) SDD'de tanımlı olan yazılım bileşenleri ve birim testleri arasındaki ilişkiyi içerir. Örneğin MyCSCI altındaki MyComponent altındaki Function1 için yazılan birim testler şunlardır diye bir tablo şeklinde tutulabilir. Tüm birim testleri başarıyla geçmiyorsa yazılım yayımlanamaz!

Bu şekilde tablolar tutmak anlamlı değil. Çünkü yazılım ilerledikçe ve testler yazıldıkça bu doküman ile aradaki bağ kopuyor. Doküman tamamen işlevsiz hale geliyor.

Bunun yerine Unit Testlerin nasıl çalıştırılacağını veya Continuous Integration sunucusunun nerede olacağını belirtmek yeterli.

Belgenin İçeriği Şöyle
1. Scope
 1.1 Identification
 1.2 System Overview
 1.3 Document Overview
2. Referenced Documents
3. Test Strategy
4. Preconditions : Operating System, Build Tools, External Libraries, Configuration Management Tools
5. Build Installation and Execution Instructions
6. Test
 Software Unit ID -> Test Class eşleşmelerini gösteren bir tablo
7. Notes

18 Ağustos 2014 Pazartesi

bash Standard Output

Throwing Output Away
bash yönlendirme yazısına taşıdım.

Connecting Programs By Output As Input
Pipe işaret ile yapılır. Dikkat edilmesi gereken nokta her komut kendi kabuğu içinde paralel olarak başlatılır. Örnek:
svn -v | less

Beware ,however , that commands run this way (i.e. connected by pipes), are run in separate subshells.




Image 2

Image Döndürme
C#
Bitmap sınıfı
RotateFlip metodu
Bu metod sadece döndürme veya döndürme + flip işlemini yapabilir. Örnek:
Sadece döndürme için 90 derecelik artırımlı enum'lar var. Rotate90FlipNone, Rotate180FlipNone, Rotate270FlipNone gibi.


TransformedBitmap sınıfının RotateTransform ile kullanılması
Örnek:
var tb = new TransformedBitmap();
BitmapImage bi = Type.Image.Clone();
tb.BeginInit();
tb.Source = bi;
var transform = new RotateTransform(180);
tb.Transform = transform;
tb.EndInit();


TransformedBitmap sınıfının ScaleTransform ile kullanılması 
Örnek:
ScaleX = -1 ise solda ayna varmış gibi döndürür.


15 Ağustos 2014 Cuma

Shell

Background Process

Shell (kabuk) ile bir process'i arkaplana atınca CPU açısından hiç bir şey değişmez. Aslında CPU bir process'in arka veya önplanda olup olmadığını da bilmez. Arka veya önplanda olma kavramları tamamen kabuk ile ilgilidir. Bu kavram sadece kabuğun bir process'in bitip bitmesini bekleyip beklemeyeceğini gösterir.

Programı Durdurmak
"Ctrl + C" tuşları ile ön planda çalışan bir programı durdurmak mümkün. Bu tuşlar ile programa SIGINT gönderiliyor. Konuylar ilgili Linux Sinyalleri başlıklı yazıya göz atabilirsiniz.

Ön Planda Çalışan Programı duraklatmak

"Ctrl + Z" tuşları ile ön planda çalışan bir programı duraklatmak mümkün. Bu tuşlar ile programa SIGTSTP sinyali gönderiliyor. Konuylar ilgili Linux Sinyalleri başlıklı yazıya göz atabilirsiniz.
Duraklatılan program ps ile bakılınca T işareti ile belirtilir.

oli     3278  0.0  0.0  14492  3160 pts/4    T    13:59   0:00 nano TEST
Process State Codes tablosu
PROCESS STATE CODES
       
       D    uninterruptible sleep (usually IO)
       R    running or runnable (on run queue)
       S    interruptible sleep (waiting for an event to complete)
       T    stopped, either by a job control signal or because it is being traced.
       W    paging (not valid since the 2.6.xx kernel)
       X    dead (should never be seen)
       Z    defunct ("zombie") process, terminated but not reaped by its parent.


Çıktının akışını durdurmak
"Ctrl + S" ile çıktının akması durdurulur. "Ctrl + Q" ile devam ettirilir. Bu tuşlat vt100 terminalinde Software Flow Control için kullanılırlar. XON ve XOFF sinyali göndererek akışı kontrol ederler. Bilgi için Seri Port API'si başlıklı yazıya da göz atabilirsiniz.

Shell ve EOF
Linux'ta Ctrl + D , Windows'ta Ctr + Z ile input stream'e EOF yazılarak shell'in çalıştırdığı programın input stream'i kapatılabilir. Böylece program sonlanır.


12 Ağustos 2014 Salı

Gömülü Proje - TransmissionQueue

Giriş
TransmissionQueue gönderme amacına göre birçok farklı şekil alabilen bir bileşen. Aşağıda bazı sınıflandırmalarda bulunmaya çalıştım.

Genel Tasarım
TransmissionQueue --(has)--TransmissionList--(has)--TransmissionNode--(has)--Data

TransmissionList bir LinkedList (ortadan silinen kuyruklar için) veya Dequeue (FIFO kuyruklar için) olabilir.

Gönderim Sırasına Göre
Periyodik Kuyruklar
Bir timer XGenerator sınıfını periyodik olarak tetikler. XGenerator TransmissionQueue kuyruğunu baştan sonra dolaşır ve zamanı gelen mesajları gönderir. Bu tür kuyruklar her 2 saniyede bir X gönderilecektir türündeki işler için kullanılır.

FIFO Kuyruklar
Kuyruğun sonuna yerleşen mesaj sırası gelince XGenerator tarafından kuyruktan çekilir ve hemen gönderilir.

Verinin Kopya veya Referans Olarak Kullanım Şekline Göre
Kopya Alan Kuyruk
Bazı kuyruklar eklenen verinin kopyasını alırlar. Böylece veri güncellenirse bir önce hali ile karşılaştırıp gönderim kuralını değiştirmeleri mümkün olur.

Reference Counting Yapan Kuyruk
Bazı kuyruklar reference counting yaparlar. Böylece verinin kopyasını almaya gerek kalmaz. Kuyrukta bekleyen veri değiştirilebilir.

Verinin Serialize Edilmesi
Gönderilecek veri bir XProtocolConverter sınıfına verilerek serialize edilir.

Periyodik Kuyruk aşağıdaki gibi olabilir
XProtocolConverter protocol (channel);
transmissionQueue.Walk (protocol);


FIFO kuyruğun serialize edilmesi aşağıdaki gibi olabilir. Eğer gönderilecek veri yoksa XProtocolConverter veri olmadığını belli eden bir mesaj gönderilir.

XProtocolConverter protocol;
TransmissionItem item = transmissionQueue.PopHead ();
if (item != NULL) {
  protocol.Serialize (stream, item);
}
else {
 protocol.SerializeEmptyMsg (stream);
}
channel.Send (stream);

Örnek
Aşağıda, serialization işlemini ve gönderim kuyruğunu gösteren basit bir tasarım örneği var.
Gönderilmek İstenen Mesajın Alınması
Gönderilmek istenen DomainObject, OutgoingMessageListener tarafından alınır. TransmissionQueue nesnesine verilir. 

Gönderilme Kurallarının Hazırlanması
Bu kuyruk, DomainObject nesnesinin nasıl parçalanması, kaç defa gönderilmesi gerektiğine karar veren bir Scheduler nesnesine verilir. Bu bilgiler TransmissionItem nesnesinde saklanır. 

Gönderme Zamanı
Kuyruğu periyodik olarak dolaş bir thread, gönderme zamanı gelen TransmissionItem nesnesini alır ve serialization işleminden geçirerek, kanaldan gönderir.

Veriyi TranmissionItem nesnesinin içine koyarak veriyi zarflama veya çalışılan platforma göre Big Endian, Little Endian göndermek gibi imkanlara da kavuşabiliriz.








2 Ağustos 2014 Cumartesi

bash file test operators

Giriş
file test operators bir nesnenin var olduğunu kontrol etmek için vardır.
Aşağıda konuyla ilgili notlarım var. Tüm seçenekleri eklemedim.

-a aslında -e seçeneği ile aynıdır ancak deprecate edilmiştir. Kullanılmamalıdır.

-e  dosyanın var olduğunu kontrol eder
True if file exists.

-f normal bir dosyanın var olduğunu kontrol eder
True if file exists and is a regular file.

-p pipe'ın var olduğunu kontrol eder.
True if file exists and is a named pipe (FIFO).
 Örnek:
if [ -p "$pipe" ]