30 Ekim 2014 Perşembe

.bashrc

bash okuma sırası
Kaynak:
/bin/bash
  The bash executable
/etc/profile
  The systemwide initialization file, executed for login shells
~/.bash_profile
  The personal initialization file, executed for login shells
~/.bashrc
  The individual per-interactive-shell startup file
~/.bash_logout
  The individual login shell cleanup file, executed when a login shell exits
~/.inputrc
  Individual readline initialization file
.profile
Bash ile ilgisi olmayan şeyler buraya yazılır. Örneğin GUI programları için PATH değişken değeri gibi şeyler bu dosyada atanabilir. Herhangi bir shell ile çalışabilmelidir. Örnek:
export TZ="Europe/Paris"
export EDITOR="vim"
if [ "$BASH" ]; then
    . ~/.bashrc
fi
uptime
Aşağıdaki örnekte tüm sistemi etkilemenin bir yolu gösteriliyor. Ulaşılmak istenen amacı gerçekleştirmenin tek yolu bu değil. Sadece öğretici bir örnek olsun diye yazıyorum.

Ortak kullanılan bir sistemde tüm kullanıcılara bellek üst sınırı konulmak istenirse profile dosyasına aşağıdaki komut yazılır.
ulimit -vH 1000000
Diğer tüm uygulamalar profile'dan doğdukları için her uygulama bu sınıra tabi olur.

.bash_profile
İçine hiçbir şey yazılmaz. Sadece .profile ile .bashrc dosyalarını yükler.

.bashrc
Bu dosya kullanıcının home dizininde bulunur (~/.bashrc).
Dosya değiştirildikten sonra source komutu ile tekrar çalıştırmak gerekir.
source ./.bashrc
Dosyanında başındaki / işareti genellikle gerekiyor.

alias
Bu dosya alias tanımlamak için uygundur.
Bir komut alias yapılmasa bile bir fonksiyon haline getirilerek kabuktan kullanılabilir. Örnekte lsl fonksiyonunu tanımlanması ve kullanımı gösterilmiş.
lsl() {
....
}
PS1
Örnek:
if [ "$PS1" ]; then
    wget "http://api.icndb.com/jokes/random" -qO- | jshon -e value -e joke -u | \
    recode html..text | cowsay -f tux
fi
.bash_logout
İçi şöyledir.
# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi



SOI 1 - Software Planning Review Checklist

Giriş
Amaç eğer planlar uygulanırsa, DO-178B tarafından belirtilen hedeflere ulaşılıp ulaşılamayacağını değerlendirmek. Planlar ve standartlar olgunlaşınca SOI-1 denetimi yapılır.

Planlama aşamasında bence en kolay yöntem Waterfall (şelale) modelini kullanmak. Şu cümleyi destekliyorum
You may prefer to plan your development using waterfall in order to have verification steps and controlled transition periods. This has the benefit of staying in line with any government regulations that may be in place.

Planlar Nelerdir?
SOI-1 öncesinde hazırlanan ve sertifikasyon otoritesine gönderilen planlar şunlar. Bu planların hiçbirisi için bir şablon sunulmuyor! Kendi şablonumuzu geliştirmek veya mevcut bir şablonu uyarlamak gerek. Açıklaması şöyle
If you’re not planning your DO-178C project, then you’re doing it wrong.


Within DO-178C during SOI#1 you need to get some solid plans in place.

You must develop:

1. Plan for Software Aspects of Certification (PSAC): a description of the software you plan to develop, the hardware environment it will be used in, the design assurance processes you will follow, and how you will demonstrate compliance, including how you will verify your implemented code and any commercial tools you will use in your
verification. This acts as the parent planning document.

2. Software Development Plan (SDP): a description of the software development processes and the software life cycle that is used to satisfy DO-178C objectives.

3. Software Verification Plan ( SVP): a description of the verification processes (Reviews, Analyses and Tests) used to satisfy DO-178C objectives.

4. Software Configuration Management Plan (SCMP): a description of the methods and environment that will be used to configure all of the design data and compliance evidence needed to achieve DO-178C certification.

5. Software Quality Assurance Plan ( SQAP): a description of the methods and associated records that will be used to ensure that DO-178C quality assurance objectives are satisfied.

For DALs C and higher, as well as producing the above planning documents, you will also need to establish and document the standards you will use for Requirements, Design, and Code, documenting the methods, rules, and tools you will use to ensure complete and consistent generation of these items in a way that will meet DO-178C and project objectives.

Once your plans are complete you can take the first step in the compliance process by having the SOI#1 review with your certification authority.
PSAC yazısına taşıdım

SDP developesthe software life cycle(s) and software development environment (11.2)

SVP defines the means by which the software verification process will be satisfied (11.3)

SCMP defines the means by which the system configuration management process objectives will be satisfied (11.4)

SQAP defines the means by which software quality assurance will be satisfied (11.5)



Gözden Geçirme
Aşağıdaki notları FAA'nın Sofware Approval Guidelines pdf'inden aldım.

SOI 1 için aşağıdaki belgelere ihtiyaç duyulur.

Burada önemli olan Software Requirements, Design ve Code için kullanılan standartlar belgeleri. Bu standartların hazır olması gerekir. Kod için "Yazılım Kodlama Standardı" kullanıldığı belirtilir.

Alt Seviye Gereksinimler (Low Level Requirements) D0-178B sürecinde tasarım olarak kabul edilir. Dolayısıyla tasarım denilince ilk akla gelen UML diyagramları olmamalıdır.

SOI 1'de DER tarafından Job Aid'deki liste kullanılır. Toplam 11 soru başlığı var. Her başlık altında alt sorular bulunuyor.

1.1Review all plans (PSAC, SCMP, SQAP, SDP, SVP, software tool
qualification plans, etc.) and standards. Based on your review of all the
plans, consider the following questions:
...
1.2Determine if additional considerations defined in Section 12 of DO-178B
have been documented and addressed in the plans. Consider the following
questions:
...
1.3Review PSAC and consider the following questions:
...
1.4Review SDP and consider the following questions:
...
1.5Review the SCM plan and consider the following questions:
...
1.6Review the SQA plan and consider the following questions:.
...
1.7Review the SVP and consider the following questions:
...
1.8Develop an understanding of the system from applicant's plans, safety assessment, standards, and briefings
...
1.9Review the software development standards and consider the following
questions:
...
1.10Review the plans to determine if real-time aspects of the software
implementation have been addressed. Consider if the following questions
have been addressed in the plans:
...
1.11If object-oriented technology is used. Consider if the following questions
have been addressed:
...

23 Ekim 2014 Perşembe

Linq to XML 3

İlk yazıda XML'i sorgulama, ikinci yazıda XML oluşturma örnekleri vardı. Bı yazıda XML'i sorguladıktan sonra başka bir veri yapısına döndürmek örnekleri olacak.

Giriş
XML nesnesi klasik Linq işlemlerinde olduğu gibi Descendants().Where().Select() şeklinde sorgulanır. Genellikle elimize geçen nesnelerin ya üzerinde dolaşırız, ya da başka bir veri yapısına çevirip saklamak isteriz.

ToArray
Bildiğimiz array döndürür. Çok basit bir örnek olarak şöyle bir kod parçası verebiliriz.
string[] values = doc.Root.Descendants().Select(x => x.Value).ToArray();

ToLookup
Multimap gibi düşünülebilir. Elimize Dictionary<string, List<string>> türünden bir veri yapısı geçer.

var lookup = doc.Descendants("Client")
                .ToLookup(x => (string) x.Element("Name"),
                          x => (string) x.Element("Value"));


pstree

pgrep
İsim ile uygulama aramamızı sağlar
$ pgrep myprocess
1900
pstree
pstree bir uygulamayı başlatan diğer uygulamaları ağaç şeklinde gösterir.
-p seçeneği
Bu seçenek en bilindik olanıdır. -p ile hangi uygulamananın parent'larını görmek istediğimizi belirtiriz.
pstree -p PID

Örnek:
$ pstree -p 602
udisksd(602)-+-{cleanup}(607)
             |-{gdbus}(605)
             |-{gmain}(603)
             `-{probing-thread}(606)

22 Ekim 2014 Çarşamba

cron

Cron ve E-Posta 
Cron çalıştırdığı uygulamanın çıktısını e-posta ile gönderir. E-posta almamak için yapılabilecek şeylerden birisi uygulamanın çıktısını yok etmek. Bu şöyle yapılabilir.
mycommand >/dev/null 2>&1

crontab
Cron dosyalarını düzenlemek için crontab komutu kullanılır
crontab -e
Bu komut ile cron ayarları dosyası sistemdeki default editor açılır.

20 Ekim 2014 Pazartesi

ACE_Thread_Manager ile yeni thread yaratmak

Not : Bu yazı ile ilgili olarak pthread_self() ile gettid() arasındaki fark başlıklı yazıya göz atabilirsiniz.
Not : Posix ile yeni thred yaratmak için pthread_create() metodunu kullanmak gerekir. Bu metod <errno.h> dosyasında tanımlı olan sonuçlardan birini döner. pthread_create Linux altında clone sistem çağrısını çağırır ve aşağıdaki gibi byarakları kullanır.

CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID

ACE_Thread_Manager

ACE_Thread_Manager ile yeni thread yaratmak çok kolay. Ancak spawn veya spawn_n metodlarını kullanırken verilen THR_NEW_LWP bitinin ne işe yaradığını pek anlayamamıştım.

Konuyu anlamak için önce Multithreading modellerine bakmak lazım. Bütün threadler kernel (çekirdek) tarafından yönetilirler. Bazı thread modelleri kernel içindeki verimliliği artırmak için değişik modelleri denemişlerdir.

Many To One (Çoktan Bire) Modeli

Bu kullanım şeklinde user space içinde bir çok thread açılsa bile kernel (çekirdek) içinde sadece bir thread açılıyor.
Aşağıdaki şekili buradan aldım ve durumu gösteriyor. Eskiden Java 1.1 zamanında green thread'ler de böyle çalışıyordu.


Bu modelin dezavantajlarından birisi, eğer bir thread I/O veya harhangi bir şey için (örneğin page-fault) bloke olursa diğer thread'ler de bundan etkilenip bloke oluyorlar. If one thread is busy on I/O will the entire process be blocked sorusunda benzer bir cevap görülebilir.


One To One (Birden bire) Modeli

Bu kullanım şeklinde user space içinde bir çok thread açılsa bile kernel (çekirdek) içinde sadece bir thread açılıyor. Aşağıdaki şekili buradan aldım ve durumu gösteriyor.

 Many To Many (Çoktan Çoka) Modeli
Bu kullanım şeklinde user space içinde bir çok thread açılınca kernel (çekirdek) içinde de bir çok. Aşağıdaki şekili buradan aldım ve durumu gösteriyor.

Benzer bir şekli ise buradan aldım.


 Peki hangi unix versiyonu hangi modeli kullanıyor ?

Solaris
Biraz araştırma yaptıktan sonra bu bayrağın sadece Solaris thread kütüphanesini taklit etmek için konulduğunu gördüm. Solaris threadlerini yaratırken thr_create metoduna bu bayrak geçiliyor. Solaris anladığım kadarıyla thread modeli olarak M:N (Hybrid Threading) modelini kullanıyor ve thr_create metodunun açıklamasında da yazdığı gibi :

Typically, THR_NEW_LWP adds a new LWP to the pool of LWPs running unbound threads.
Yani bu bit ile muhtemelen yeni bir kernel threadi yaratılıyor ve o da bizim user-level threadimizi çalıştırıyor.

Buradaki yazıda many-to-many modelin Solaris 9'dan önceki versiyonlarda default model olduğu yazıyor.

Bir başka yazıda ise M:N (Hybrid Threading) modelinin Solari 9'da terk edildiği bilgisini gördüm ama bunu teyit edemedim.

Linux
Ancak Linux üzerinde pthread_setconcurrency() metodu Linux User Manuel'de şöyle açıklanmış :


NOTES
       The default concurrency level is 0.

       Concurrency levels are only meaningful for M:N threading implementations, where at any moment a subset of a process's set  of  user-level  threads  may be bound to a smaller number of kernel-scheduling entities.  Setting the concurrency level allows the application to give the system a hint as to the number of kernel-scheduling entities that should be provided for efficient execution of the application.

       Both LinuxThreads and NPTL are 1:1 threading implementations, so setting the concurrency level has no meaning.  In other  words,  on  Linux  these functions merely exist for compatibility with other systems, and they have no effect on the execution of a program.
Yani Linux zaten 1:1 (Kernel-level threading) kullandığı için bu bayrağı set etmenin hiç bir faydası yok. Set edilse de edilmese de bir fark yaratmaz.

Bu arada not olarak şu bilgiyi eklemek te faydalı olacaktır sanırım. Linux üzerinde posix threadlerini kullanmak için libc (C Standart kütüphanesi) lazım.  Linux üzerindeki C standart kütüphanesi glibc'dir (GNU C Standart kütüphanesi). Bu kütüphane ise Posix threadleri için NTPL (Native Posix Thread Library) kütüphanesini kullanır. NTPL ise yukarıda da anlatıldığı gibi "Birden-Bire" modelini benimsemiştir.

Daha eski Linux sürümlerinde NTPL yerine "LinuxThreadLibrary" kütüphanesinin de kullanıldığını görebilirsiniz.

Buradaki bir sunumda Linux'un çekirdek 2.4 ile 2.6 versiyonları arasındaki threadler için kullanılan kütüphaneleri gösteren bir şekil de var.

Not: Posix threadleri işletim sisteminden daha yukarı seviyede tanımlanmış bir spesifikasyondur. Bu yüzden Posix thread'lerine verilen thread numarası ile örneğin Linux'taki thread numaraları birbirlerini tutmazlar. Sebebini anlamak için çoktan bire modeline bakmak yeterli olacaktır. Bu yüzden Linux'taki getid() metodu ile Posix'teki pthread_self() metodları farklı sayılar döndürürler.


Ancak posix threadlerine numara verme algoritmasını halen bulabilmiş değilim. Bulunca bu yazıyı güncellemeyi düşünüyorum.

Thread Priority

Yazının bütünlüğü açısından thread priority atamanın da eklenmesi gerektiğini düşünüyorum. Bu konuyla ilgili olarak Equivalent of SetThreadPriority on Linux (pthreads) başlıklı yazıya göz atılabilir. Önemli metodlar arasında sched_get_priority_max , pthread_setschedprio ve pthread_attr_getschedpolicy sayılabilir.

18 Ekim 2014 Cumartesi

Dinamik Diller

C#
.Net 4.0 ile gelen Dynamic Language Runtime ile dinamik dillere mahsus bazı özellikleri C# ile kullanabilmek mümkün.

ExpondoObject
dynamic yazısına taşıdım.

dynamic anahtar kelimesi
C# ile gelen dynamic kelimesi ile static type kontrollerinden bir nebzeye kadar kurtulabilmek mümkün. Bu kelime Python gibi diller ile C#'ın etkileşime geçebilmesi için eklendi.

dynamic kelimesi Visitor örüntüsünü çok daha kısa ve kolay hale getiriyor.

dynamic kelimesi Property'ler için kullanılabilir. Örnek'te bir çok farklı tipten nesneyi döndüren Val metodu var. Döndürülen nesnelerin ToString () metodları olduğu için hepsi consola yazılabiliyor.

using System;
using System.Collections.Generic;

abstract class A
{
    public abstract dynamic Val { get;   set; }

}
class B : A
{
    public override dynamic Val { get;  set; }
}
class C : A
{
    public override dynamic Val { get;  set; }
}
class D : A
{
    public override dynamic Val { get;  set; }
}

class Program
{
    static void Main(string[] args)
    {
        var list = new List<A> { new B(), new C(), new D() };
        // ... 

        foreach (A item in list)
        {
            Console.WriteLine(String.Format("Value is: {0}", item.Val));
        }
    }
}

dynamic olarak alınan bir nesnene erişirken her zaman RuntimeBinderException'a dikkat etmek gerekir. Örnek:
void WriteClassDetails(dynamic instance)
    {
        try
        {
           Console.WriteLine(instance.Property);
           instance.Method();
        }
        catch (RuntimeBinderException ex)
        {
            ErrorWriters.WriteRuntimeBinderException(ex);
        }
    }

8 Ekim 2014 Çarşamba

Stratejik İş Planı

Giriş
Stratejik İş Planı (Strategic Business Plan) işinizi gelecekte hangi noktada görmek istediğinizi ve bu noktaya nasıl gelmeyi planlandığınızı anlatan bir belgedir.
Bu belgenin içeriği sektöre göre değişiklik gösterse de bazı bölümler hemen her planda mevcuttur.

1. Yönetici Özeti (Executive Summary)
Şirketin mevcut durumu ve nerede olması gerektiğini özetler.
2. Environment Evaluation
2.1 Business Areas : İş yaptığımız müşteriler
2.2 Current and Target Markets
2.3 SWOT Analysis : Güçlü ve zayıf yönlerimizi, tehdit ve fırsatları içerir.
2.4 Market Analysis : Pazarın büyüklüğü, pazarın segmentleri, pazar payımız
2.5 Potential Projects : Olası projeler
2.6 Investments : Olmak istediğimiz noktaya varmak için yapılan yatırımlar

3. Corporate Strategy
4. Management of Business Plan
Planın nasıl yürütüleceği.

C# Regex örnekleri

Giriş
RegEx sınıfını bir türlü tam olarak kullanmayı öğrenemedim. Kaç tane yazı yazdım hiçbirisi hoşuma gitmedi. C# için yeni bir yazı başlatıyorum.

Repeated Characters
Tekrar eden karakterleri bulmak için (.)\1 kullanılır.
Örnek'te tekrar eden karakterler bulunuyor ve karakter + tekrar eden karakter sayısı şeklinde yazılıyor. Regex.Replace metoduna verilen 3. parametre bir MatchEvaluator delegate. Bu delegate her math eden örüntünün neyle değiştirileceğini döner. Yani bir string dönmek zorunda.

public static string Compress(string str) {
  return Regex.Replace(str, @"(.)\1*", m => m.Groups[1].Value + m.Value.Length);
}

    



DecimalFormat

Java
DecimalFormat yazısına taşıdım.

C#
String.Format metodu
Örnek:
int number = int.Parse("123456");
String.Format("{0:### ###}", number);
çıktı olarak
"123 456"
verir.





5 Ekim 2014 Pazar

Linq Quantifier Metodları

Not : Ana Linq yazısına burada. Metodları işlevlerine göre gruplandırdığım için bu yeni yazıya gerek duydum.

Giriş
Quantifiers kelimesi Türkçe'ye tam çevirilemiyor. İngilizce gramerinde quantifiers olarak geçen kelimeler some, any, a few, a little, much, many, a lot of vs.

Linq dünyasında quantifers olarak anılan olarak tasnif edilen All, Any, Contains metodlar sayısal bir değer yerine boolean bir sonuç döndürürler.

Diğer algoritmalar için buraya bakabilirsiniz.

All
Örnek yaz

Any
İki overload'u var.

Lambdasız kullanımı
Eğer herhangi bir lambda verilmezse, enumerable içinde nesne olup olmadığı döner.
Determines whether a sequence contains any elements.

Örnek:
types.Where((x, i) => values[i].GetType() != x).Any()

Lambdalı kullanımı
Herhangi bir elemanın koşulu yerine getirip getirmediğini boolean olarak döndürür.
Determines whether any element of a sequence satisfies a condition.
İki listenin contains koşulu için kullanılabilir. JobList ve MasterDataList isimli iki listemiz olsa, ve Master liste içinde bulunan işleri çekmek istesek aşağıdaki gibi yapabiliriz.
jobList.Where(job => masterDataList.Any(m => m.Id == job.MasterDataId));

Contains
Örnek yaz