24 Nisan 2016 Pazar

Javascript Google Maps Marker

Giriş
Marker harita üzerinde gösterilen kırmızı renkli noktadır.

constructor
Harita yüklenirken bir marker açmak için şöyle yaparız.
var myCenter=new google.maps.LatLng(...,...);
var marker=new google.maps.Marker({
            position:myCenter
     });


var  map=new google.maps.Map(...,...);
marker.setMap(map);
click
Marker'a tıklanınca bilgi penceresi açmak için şöyle yaparız.
var contentString ="Your Content String";
google.maps.event.addListener(marker, 'click', function() {

  var infowindow = new google.maps.InfoWindow();
  infowindow.setContent(contentString);
  infowindow.open(map, marker);
});

21 Nisan 2016 Perşembe

boost iostreams array_device

Array Device Sınıfları
Bu sınıflar stream'in verilen diziye yazmasını veya diziden okumasını sağlar.

basic_array_sink - Write only
Yazma aracı. Stream verilen buffer'a yazar. Örnek
char buffer[4096];

boost::iostreams::basic_array_sink<char> sr(buffer, buffer_size);  
boost::iostreams::stream< boost::iostreams::basic_array_sink<char> > source(sr);

boost::archive::binary_oarchive oa(source);

oa << serializable_object; 
Eskiden strstream sınıfı da bu özelliği sağlardı. Sonradan bu sınıf deprecate edildi.
void fun(char *buff, unsigned size)
{
    std::strstream str(buff, size);
    str << "hello world: " << 5;
}
Aslında basic_array_sink benzeri bir sınıf kodlamak çok kolay. Tüm yapmamız gereken belirtilen bellek alanına verilen değeri memcpy ile kopyalamak ve destination pointer'ı ilerletmek.

basic_array - Read ve Write
Örnek ver

array_sink - Write
basic_array<char> sınıfının özelleşmiş halidir. char dizisi ile çalışırken şöyle yaparız
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
#include <iostream>

using namespace boost::iostreams;

int main()
{
  char buffer[16];
  array_sink sink{buffer};
  stream<array_sink> os{sink};
  os << "Boost" << std::flush;
  std::cout.write(buffer, 5);
}
boost::array ile çalışırken şöyle yaparız.
using namespace boost::iostreams;

boost::array<char, 16384> headerBuf;
array_sink          sink    {headerBuf.begin(), headerBuf.size()};
stream<array_sink>  os      {sink};
os << "somedata";

18 Nisan 2016 Pazartesi

SVG

Giriş
Svg html içinde şöyle başlıyor.
<svg height="200" width="500">
  ...
</svg>
Şöyle de yapılabilir.
<svg  version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
</svg>
path - html
Şöyle yapılıyor. M move, L line anlamına geliyor.
<path fill='none' stroke-width="30" stroke="black" d="M 100 63.125 L 254 63.125"/>

JS ile SVG'yi dinamik yaratmak
Şöyle yaparız
var svgimg = document.createElementNS('http://www.w3.org/2000/svg','image');
svgimg.setAttribute('height','50');
svgimg.setAttribute('width','50');
svgimg.setAttribute('x','50');
svgimg.setAttribute('y','50');
$('svg').append(svgimg);
Eğer bir href atamak istersek şöyle yaparız.
svgimg.setAttributeNS('http://www.w3.org/1999/xlink', 'href' ,'http://x.svg');

16 Nisan 2016 Cumartesi

GNU g++, gcc, make dosyası


gcc
gcc GNU ile kullanılan derleyici. Aslında gcc jenerik bir derleyici. Verilen dosya uzantısına göre gerekli olan derleyiciyi çağırıyor. Örneğin c++ dosyası verilirse g++ derleyicisini çağırıyor. Bu konu ile ilgili daha detaylı bilgiyi burada bulabilirsiniz.

gcc genelde şu dizine kurulur.
/usr/bin/gcc

g++
Bir c++ programını derlerken aslında g++ ile beraber bazen cc1 veya cc1plus isimli bir başka programın daha çalıştığını görüyoruz. cc1plus, g++ tarafından çağırılan gerçek derleyici oluyor.

Bazı gcc/g++ seçenekleri
gcc seçenekleri yazısına taşıdım.

Linker
Statik kütüpahene ile linklerken linker sadece ihtiyacımız olan metodları binary çıktının içine dahil eder. Dinamik kütüphanelerde böyle bir seçenek yoktur.

Burada verilen bir metodun değiştirme örneği var.

make dosyası

make dosyasını renkledirilmiş görmek için Notepad++ içinde Language / Makefile menüsünü tıklamak lazım.

Çok basit bir make dosyası
Şöyle yazılır
CXX=g++
CXXFLAGS=-std=c++11 -g -O2
LDLIBS=-ltbb

EXE=$(basename $(wildcard *.cc))

all: $(EXE)

clean:
    rm -fr $(EXE) *.dSYM
Default Değişkenler
makefile ve değişken yazısına taşıdım.

make komutuna dışarıdan parametre girmek
3 yöntem var.
1. ortam değişkenleri make dosyası içinde aynen kullanılabilir.
2. Komut satırından. Örnek:
make target FOO=bar
Buradaki örnekte parametreler make komutundan önce yazılmış. Önce veya sonra yazmanın farkını bilmiyorum.
$ CFLAGS="-Wall" make ex1
3. Ana make dosyasından export ederek. Örnek:
# Do like this
CFLAGS=-g
export CFLAGS
target:
        $(MAKE) -C target
make ve target
makefile ve target yazısına taşıdım.

dependency olarak tüm dosyalar
Aşağıdaki gibi yapabiliriz.
CPPFLAGS := -MMD -MP
CXXFLAGS := -Wall -Werror -std=c++11 -pedantic -Wvla -g
SOURCES  := $(wildcard *.cpp)

main: $(SOURCES:.cpp=.o)

-include $(SOURCES:.cpp=.d)
Eğer eski svn'i kullanıyorsak bazı dosyaları dışarıda bırakmak için şöyle yaparız.

SRC_ROOT := ./src
SRC_FILES := $(notdir $(shell find $(SRC_ROOT) -path "*/.svn" -prune -o -type f -name "*.cpp" -print))

target için dependency
Eğer target'ımızın dependency olarak gördüğü bir başka target, makefile içinde ve diskte yoksa aşağıdaki gibi bir hata alırız. Hatalı durumlarda komut satırına Stop. yazılır.
make: *** No rule to make target `b', needed by `a'.  Stop.

Eğer target'ımız bir önceki make komutundan sonra değişmemiş ise, aşağıdaki Nothing to be done ile başlayan cümleyi alırız.
make: Nothing to be done for `all'.

target için komut
Target için örnek command
fileClient:
    $(CC) $(CFLAGS) $(LDFLAGS) src/main.c -o fileClient

default target
Default target makefile içindeki ilk tanımlı target'tır. makefile target ismi verilmeden çağırılırsa default target çalışır.

.ignore
Eğer harici komut 0'dan farklı bir değer ile çıkarsa make komutu çalışmayı bırakır. Harici komutun döndürdüğü değer dikkate almamak için ignore kullanılır. Örnek:
  1. # Both these command exit non-0 when any violations occur
  2. # We want to ignore that so we can get all the results in jenkins
  3. .IGNORE: check-style-ci check-cpd-ci


.phony target
phony kelime anlamı olarak sahte demek. .phony genellikle harici bir komutu çalıştrmak için kullanılır. target'ımız ile aynı isimde bir başka dosya olsa bile, komutumuz çalışır. Örnek''te gösterildiği gibi, "make clean" yapılırsa clean isimli bir dosya olsa bile harici clean komutu çalışır.
.phony : clean
clean :
         rm -rf *.o
Bir başka örnek'te check-style komutu çalıştırılıyor

.PHONY: check-style
  1. check-style:
  2.     phpcs --standard=CakePHP --extensions=php,ctp -p ./


değişken tanımlama ve ekleme örneği
Makefile içinde anladığım kadarıyla iki çeşit değişken var. İlki değişken := değer şeklinde tanımlanıyor ve değişkenin değeri, makefile ilk defa okunurken bir kereliğine hesaplanıyor. Diğeri ise macro gibi ve değişken = değer şeklinde tanımlanıyor. Bu tür ise değişkenin geçtiği her yere değerinin yapıştırılması gibi düşünülebilir.

Değeri Hemen Hesaplanan Değişken
Örnekler:

LDDIRS := -L$(ORACLE_LIB)
LDDIRS += -L$(ORACLE_LIB)

Değeri hemen hesaplanan değişken shell komutu çalıştırmak için de kullanılabilir. Örnekte make çalışırken ne olursa olsun obj isimli bir dizin yaratmak gösteriliyor.
_dummy := $(shell mkdir -p obj)

Macro Değişken

Makefile işlenirken $(Değişken İsmi) şeklinde metinler aynı C'deki #define ile tanımlanan macro gibi metin açılımına uğrarlar. Yani değişken ismi yerine değişkenin değeri varmış gibi işlem yapılır.

Değişkenin Değerine Erişmek
$(Değişken İsmi) şeklindeki kullanımda değişkenin değerine erişilir.

Bir başka dosyadaki değişkenleri dahil etmek
Aşağıdaki gibi yapılabilir.
include $(DIR)/make/Makefile.vars

if koşulu

ifeq($(Variable),0)
  DIRECTORY := ./debug
else
  DIRECTORY := ./release
endif


Include Path Tanımlama
INCLUDES := -I../../include\
                         -I../../src
şeklinde çok satıra tanımlanabilir

Make İçindeki Komutlar
başka make dosyasının çağırılması
Genelde tüm projeleri derleyen en üstte bir make dosyası bulunur. Tepedeki make dosyasından başka make dosyalarını çağırmak için make -C komutu kullanılabilir. Kendi değişkenimizi, diğer make dosyasına da aşağıdaki gibi geçebiliriz.
Örnek:
subsystem:
         $(MAKE) -C subdir CPU=$(CPU)
cp
all :
 $(CP) ./debug/*.exe $(OUTPUT)

mkdir
Eğer bir dizin yoksa yaratmak için kullanılır
if [! -d "$(DIR)"]; then mkdir -p "$(DIR)";fi

notdir
SRC_FILES := $(notdir $(foreach dir; $(DIRS), $(wildcard $(DIR)/*.c $(DIR)/*.cpp) ) )

rm
clean :
     $(RM) $(OUTPUT)

subst
Windows dizinini, Unix dizinine çevirir
HOME := $(subst \,/, $(HOME))
make ve shell
$(shell command) şeklinde yazılan komutlar bir kabukta çalıştırılır ve çıktısı bir değişkene atanabilir. Eğer komutun çıktısına ihtiyaç yoksa $(shell ...) şeklinde çağırmaya da ihtiyaç yoktur. Örnek:
USERNAME := $(shell whoami)
Bir başka örnekte dostanın için bir değişkene alınıyor.
CONTENTS := $(shell cat foo)

bazı komut örnekleri
mkdir
Örnekte obj isimli dizin yaratma gösterilmiş
mkdir -p obj
find
Örnek:
HEADER = $(shell find . -name '*.h')

make clean
Bu komutla make'in yarattığı her şey temizlenir.

make distclean
Bu komutla make dosyası dahil ./configure ile yaratılan her şey silinir.

make install
Bir uygulamayı derler ve kurar.
./configure
make
sudo make install

make file çıktısı
make komutu errror ve warningleri stderr akımına veriyor. warning ve error'ları görmek için aşağıdaki gibi yapılabilir
make 2> out.txt

stderr da stdout'a yönlendirmek ve çıktı içinde hata aramayı kolaylaştırmak için aşağıdaki komut kullanılabilir.

make 2>@1 | grep warning -A 2 -B 2

-A 2 -B 2 seçenekleri warning içeren satırın 2 üst (above) ve 2 alt (below) satırını da gösterir ki hatayı daha rahat görebilelim.

12 Nisan 2016 Salı

boost coroutine

Giriş
Ne olduğunu tam anlamadım. İleride daha detaylı yazarım. Şöyle yaparız.
typedef boost::coroutines::coroutine<void>::push_type coroutine;
typedef boost::coroutines::coroutine<void>::pull_type yield_context;
typedef std::vector<coroutine> coroutine_list;

bool run_once_all(coroutine_list& coros)
{
    bool pending = false;
    for (auto& coro : coros)
    {
        if (coro)
        {
            coro();
            pending = pending || !coro.empty();
        }
    }
    return pending;
}

void run_all(coroutine_list& coros,
             const boost::chrono::nanoseconds& idle_ns)
{
    while (run_once_all(coros))
    {
        boost::this_thread::sleep_for(idle_ns);
    }
}

void run_all(coroutine_list& coros, yield_context& yield)
{
    while (run_once_all(coros))
    {
        yield();
    }
}



11 Nisan 2016 Pazartesi

ffprobe

hide_banner seçeneği
Komut şöyle
$ ffprobe data0001.ts -hide_banner
Şu çıktıyı alırız.
Stream #0:0 : Video: mpeg2video ...
Stream #0:1: Audio: mp2 ...  
Stream #0:2: Audio: mp2 
Stream #0:3: Subtitle: dvb_subtitle 
Stream #0:4: Subtitle: dvb_subtitle