19 Ekim 2015 Pazartesi

Posix open metodu

Metodun imzası şöyle
int open(const char *pathname, int flags, mode_t mode);
Yeni Dosya Oluşturmak
Mode için genelde 0777 kullanılır.
int filehandle = open (filename, O_WRONLY | O_CREAT, 0777);
Bu sayı dosya için
rwxrwxrwx
hakkını verir.




15 Ekim 2015 Perşembe

XSLT

Giriş
XSLT'yi şimdiye kadar sadece XML dosyasını HTML'e dönüştürmek için kullandım. Dönüşme işlemini sadece Internet Explorer tarayıcısı gösteriyor. XSLT çok fazla kullanılmadığı için ölü bir teknoloji olarak niteleniyor.

XML Dosyasına
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="my.xsl"?>

satırını ekleyin

XSLT İle HTML Tablo Yaratma İskeleti
Tablo yapmak için yazılan XSLT kabaca şöyledir. Mantık olarak match=/ ile XML'deki kök düğümden başlarız. "for-each select" veya "value-of select" ile ismini bildiğimiz diğer düğümlere erişir ve tablonun satırlarını oluştururuz.

<xsl:template match="/">
   ....Tabloyu yarat
  <xsl:for-each select="Messages/Message">
    ....Tablonun satırlarını oluştur
  </xsl:for-each>
</xsl:template>

Tam çalışan bir başka örnek burada. Örneğin tablo oluşturmaya başlama kısmı yine aynı
<xsl:template match="/">
  <html>
    <head>
      <meta lang="en" />
      <meta name="description" content="Personal Resume and Portfolio" />
      <title><xsl:value-of select="r:name/@shortForm"/> Website</title>
    </head>
    <body>
      <xsl:apply-templates select="r:resume"/>
    </body>
  </html>
</xsl:template>


Tablo Çeşitleri
İki çeşit tablo oluşturulabilir. İlkinde XML kayıdının alt tag'lerinin değerleri tablonun sütunlarını doldurur. Diğerinde ise XML kaydının attribute'ları tablonun satırlarını oluşturur.


Örnek XSLT Dosyası
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
      <html>
      <head>

           <style type="text/css">
               td:nth-child(odd){
                    background-color:#d9edf;
               }
           </style>

      <head>
      <body>
            <table border="1">
                <xsl:for-each select="/DetayCollection">
                    <tr>
                    <td><xsl:value-of select="AboneDetay/AboneId" /></td>
                    <td><xsl:value-of select="AboneDetay/HizmetNo" /></td>
                   </tr>
               </xsl:for-each>
            </table>
      </body>
      </html>
    </xsl:template>

</xsl:stylesheet>

satırlarını ekleyin.

<xsl:template>
İsmi verilen XML tag'ine rastlayınca çalıştırılması istenen işi tanımlar. Örnek:
<xsl:template name="power">
</xsl:template>

<xsl-for-each>
Tag'in tüm attribute'larını almak için

<xsl-for-each select="@*">
  <xsl:value-of select="name()"/> <xsl:value-of select="."/>
</xsl-for-each>

Belli bir tag'in değerini almak için
<xsl:value-of select="AboneDetay/AboneId"/>

dup2

dup2 nerede kullanılır
dup2() aslıda I/O redirection anlamına geliyor. En anlamlı kullanım yeri fork()+pipe() ikilisinde.

Eğer iki uygulama birbirlerine bilgi göndereceklerse ve normalde stdin/stdout ile çalışıyorlarsa, aralarında açılan pipe, dup2() kullanılarak stdin/stdout yapılır. Böylece uygulama konsola yazdığını düşünürken aslında pipe'a yazar.

ls -l | sort şeklinde iki uygulama açtığımızı düşünelim. ls parent uygulama, sort ise child uygulama olsun.

Parent process başlarken şöyle yapar. Böylece çıktısı pipe'a gider.
dup2(*pipeOUT, STDOUT_FILENO);
Child process ise şöyle yapar. Böylece pipe'tan gelen veriyi okuyabilir.
dup2(*pipeIN, STDIN_FILENO);

12 Ekim 2015 Pazartesi

GoF - Iterator Örüntüsü

Iterator - Davranışsal Örüntü
Iterator ve Visitor birbirlerine zıt tasarım örüntüleri. Iterator pull,Visitor ise push modunda çalışıyor diye düşünülebilir.
"The iterator pattern provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation"
Veri Yapısını Döndürmek
Iterator tasarım örüntüsü, veri yapımızın kendisi veya kalıttığı arayüzü (örneğin IList) döndüren bir metod yerine iterator döndüren metodlar kullanmayı öneriyor. IList döndürent metodlar Java dünyasında çok yaygın. C# dünyasında ise IEnumerator döndüren metodlar biraz daha yaygın.

Iterator döndürmek istersek çeşitli programla dillerinde kullanılan örnekler şöyle:

Java
Iterator Arayüzü ile sağlanıyor.

C#
IEnumerable Arayüzü ile sağlanıyor.

C++
Veri yapımızın iterator tipini typedef veya using ile dış dünyaya açarız. begin(),end() ve bunların const türevlerini gerçekleştiren metodlar sunarız.
Örnek
class AddressBook
{
  using peoples_t = std::vector<People>;
public:
  using iterator = peoples_t::iterator;
  using const_iterator = peoples_t::const_iterator;

  AddressBook();

  iterator begin() { return people.begin(); }
  iterator end() { return people.end(); }
  const_iterator begin() const { return people.begin(); }
  const_iterator end() const { return people.end(); }
  const_iterator cbegin() const { return people.cbegin(); }
  const_iterator cend() const { return people.cend(); }

private:
  peoples_t people;
};


10 Ekim 2015 Cumartesi

Literal Ekleri

Literal Nedir?
Literal aynen kullanılan değer anlamına gelir. Programlama dillerinde integer, kayan nokta, string gibi koda yazılan değerin işlemden geçmeden kelimesi kelimesine kullanılması için vardır.

Hesaplanan Literal Nedir?
Bir çok programlama dili literal'ları kullanarak bazı sabit değerlerin hesaplanabilmesine imkan tanır. Örneğin
5 * 5
gibi.  Bu yapı literal olarak ta kabul edilebilir, expression olarak ta kabul edilebilir. Yani bu yapı programlama dillerinde farklı isimler ile anılır. Java dilinde bu yapıya "Compile Time Constant Expression" deniliyor.

Literal Okumayı Kolaylaştırmak
Java
Nümerik Literal yazısına taşıdım.

Literal Ekleri
Aşağıda programlama dillerinde kullanılan literal ekleri ile ilgili notlarım var.

C++
Raw String
Raw String yazısına taşıdım.

Karakter Literal ÖnEkleri
Konuyu Literal yazısına taşıdım.

Integral Ekleri
Konuyu Literal yazısına taşıdım.

Binary Literal
Konuyu Literal yazısına taşıdım.

User Defined Literal
Konuyu Literal yazısına taşıdım.

C#
Short için literal tanımlamak mümkün değil.
L : Long
64 bit değişken şöyle tanımlanır
long counter = 9L;
U : Unsigned

D: Double
F :Float
M : Decimal

Java
C# ile aynı

D: double
Şu kod çalışır.
Double.parseDouble("100d");



Javasript ve JSON

Giriş
Javascript dilinde nesneyi JSON formatına çevirmek için JSON sınıfı kullanılıyor.

stringify - array ile
Elimizde bir string olsun.
var days="1,2,3";
String'i array'e çevirip JSON'a dönüştürelim.
jsonstring = JSON.stringify(days.split(','));

7 Ekim 2015 Çarşamba

Visual Studio

Visual Studio
VS ile ilgili aldığım bazı notlar aşağıda.

Ayarlar
Minimize simgesi yanındaki Quick Launch ile aranan komutlar kolayca bulunabilir.

32 bit veya 64 bit Platform
.Net 4.5 ile Build menüsü altında Platform AnyCPU seçilirse, 32 bitlik veya 64 bitlik işletim sisteminde rahatça çalışılabilir.

Compiler

SDL'i Etkilleştirmek (Secure Development Lifecycle)
Properties / Configuration Properties / C/C++ / General / SDL Checks seçeneği Yes (/sdl) yapılmalı. Böylece derleyicinin uyarı olarak değerlendirdiği bazı şeyler hata olarak değerlendirilmeye başlanır. Örneğin
warning C4700: uninitialized local variable 'MyVar' used mesajı yerine
error C4700: uninitialized local variable 'MyVar' used hatası alırız.

PreCompiled Header
Intrusive Yöntem
PreCompiled Header için projeye stdafx.cpp ve stdafx.h dosyaları eklenir. stdafx.h içine include direktifleri konulur. Proje build edilirken önce stdafx.cpp derlenir. Bu işlem sonucunda pch uzantılı bir dosya çıkar. Diğer tüm kaynak kodlardaki ilk include direktifi stdafx.h olmalıdır.
Projede ayarlar şöyle yapılır.

Non-Intrusive Yöntem
Portable kod yazmak için kaynak kodlara stdafx.h include direktifi eklemek uygun değil. Linux'ta çalışmaz. Bunun yeriner bu direktif varmış gibi davranan bir compiler switch var. /FI ile bu iş gerçekleşir.



Editörler İlgili Notlar

Kaynak Kodu formatlamak
CtrlA , Ctrl K, Ctrl F tuşlarına sırayla basmak lazım.

Kaynak Kod Eklemek
"Add Existing Item" menüsü kullanılırken sağ alttaki Add düğmesi "Add as Link" haline getirilirse kaynak kod kopyalanmaz.

Kaynak Kod Dosyasını Açmak
VASSISTX menüsü altında "Open File in Solution" menüsü ile dosya ismine göre arama yapılabilir.
Aynı işlem Edit / Navigation To veya Ctrl + Command (,) ile de yapılabilir.

Kaynak Kod Dosyasını Önizleme
Solution Explorer penceresinde "Preview Selected Items" seçilerek tıklanan kaynak kod otomatik açılabilir.

Kaynak Kodda İleri Geri Yapma
View / Navigate Backward veya Forward ile önceki ve sonraki kod satırları arasında dolaşılabilir.

Blokları Kapatma İşareti Çıkartma
Tools / Options / C/C++ / Formattin / Outlining / Outline Statement Blocks = True yapılmalı

Clipboard
Ctrl + Shift + V clipboard listesini gösterir.

Output Penceresi
Output penceresinde hataları kolayca dolaşmak için F8'e bas

Debugger
C++ notları Watch Penceresi
Dinamik yaratılan bir array'i Watch penceresinde görmek için değişken isminden sonra virgül ve bir sayı yazmak gerekir. pArray,10 gibi.

C# Notları Watch Penceresi
Bir sınıfın belli bir özelliğinin gösterilmesini istiyorsak aşağıdaki gibi yapabiliriz. Böylece Watch pencersindeki Value sütununa nesnenin Name alanının değeri yazılır.
[System.Diagnostics.DebuggerDisplay("Employee: '{Name}'")]
public class Employee {
    public string Name { get { ... } }
    ...
}
Breakpoint
Breakpoint için condition yani koşul yazılabilir. Koşul sadece değişkenlerde işe yarıyor. Getter metodu kullanması istenirse çalışmıyor. Örneğin koşul olarak şunu yazarsak property alanına erişmek için aslında debugger'ın bizim kodumuzdan bir getter çağırması gerekir ki bunu yapacak kadar akıllı değil.
iterator.MyProperty == null

Tracepoint
Breakpoint gibi konuluyor. Kod satırına sağ tıkla Breakpoint / Insert Tracepoint menüsünü seç

const char* pMessage = "..." şeklindeki bir değişkeni göstermek için
{pMessage} is processed
yazılmalı.

Prebuild Event
Buradaki komutlar shell tarafından çalıştırılıyor. $(ProjectDir) projenin bulunduğu dizini gösterir.

F5 ve Ctrl + F5
Uygulamayı F5 ile çalıştırınca, daha yavaş çalışan debug heap kullanılıyor. Diğeri ile çalıştırınca normal heap'i kullanıyor.

Profiler
Analyze / Start Performance Analysis ile profiling işlemleri başlatılır. İşlem bitince Notifications penceresi altında Show Just My Code seçilirse sistem dll'leri içinde harcanan zaman gösterilmez.