20 Şubat 2017 Pazartesi
18 Şubat 2017 Cumartesi
Gömülü Proje - BitStream
Giriş
Gömülü projelerde o kadar çok bitlerden oluşan veri var ki bir tane BitStream sınıfı her zaman lazım oluyor.
Dahili Metodlar
BoundaryCheck metodu
Okuma veya yazma işleminden önce bellek alanında taşma olmadığını kontrol etmek içindir.
Bellek Metodları
GetBuffer metodu
BitStream'e verilen belleği döndürür.
GetBufferSize metodu
BitStream'e verilen belleğin büyüklüğünü döndürür.
Konum Metodları
SetBitPosition metodu
Belirtilen bit konumuna gitmeli. Örneğin 15. bit'e git denilebilmeli. Kendi içine kaçıncı byte ve bit olduğunu hesaplamalı. Bu konumdan itibaren okuma yazma işlemi yapılabilir. Bellek alanını aşılıyorsa exception atmalı.
GetBytePosition metodu
Özellikle yazma işleminden sonra kaç byte yazıldığını almak için kullanılır.
SetBytePosition metodu
Belirtilen byte konumuna gitmeli. Bu konumdan itibaren okuma yazma işlemi yapılabilir. Bellek alanını aşıyorsa exception atmalı.
Okuma Metodları
PadBits metodu
Bazen bit alanlarını byte'a tamamlamak gerekir.
ReadNBits metodu
Belirtilen değer kadar bit okur. Okuma konumu bellek alanı dışına taşarak bir sonraki byte'a taşabilir. Bu bir sorun değil.
ReadNBytes metodu
Bit mesajları payload içerebildiği için 8 byte'a kadar bir değer okumak mümkün olmalı. Tabi işleme başlamadan önce okuma konumu byte başını göstermeli.
WriteNBytes metodu
Bit mesajları payload içerebildiği için 8 byte'a kadar bir değer yazmak mümkün olmalı. Tabi işleme başlamadan önce yazma konumu byte başını göstermeli.
Gömülü projelerde o kadar çok bitlerden oluşan veri var ki bir tane BitStream sınıfı her zaman lazım oluyor.
Dahili Metodlar
BoundaryCheck metodu
Okuma veya yazma işleminden önce bellek alanında taşma olmadığını kontrol etmek içindir.
Bellek Metodları
GetBuffer metodu
BitStream'e verilen belleği döndürür.
GetBufferSize metodu
BitStream'e verilen belleğin büyüklüğünü döndürür.
Konum Metodları
SetBitPosition metodu
Belirtilen bit konumuna gitmeli. Örneğin 15. bit'e git denilebilmeli. Kendi içine kaçıncı byte ve bit olduğunu hesaplamalı. Bu konumdan itibaren okuma yazma işlemi yapılabilir. Bellek alanını aşılıyorsa exception atmalı.
GetBytePosition metodu
Özellikle yazma işleminden sonra kaç byte yazıldığını almak için kullanılır.
SetBytePosition metodu
Belirtilen byte konumuna gitmeli. Bu konumdan itibaren okuma yazma işlemi yapılabilir. Bellek alanını aşıyorsa exception atmalı.
Okuma Metodları
PadBits metodu
Bazen bit alanlarını byte'a tamamlamak gerekir.
Belirtilen değer kadar bit okur. Okuma konumu bellek alanı dışına taşarak bir sonraki byte'a taşabilir. Bu bir sorun değil.
ReadNBytes metodu
Bit mesajları payload içerebildiği için 8 byte'a kadar bir değer okumak mümkün olmalı. Tabi işleme başlamadan önce okuma konumu byte başını göstermeli.
WriteNBytes metodu
Bit mesajları payload içerebildiği için 8 byte'a kadar bir değer yazmak mümkün olmalı. Tabi işleme başlamadan önce yazma konumu byte başını göstermeli.
13 Şubat 2017 Pazartesi
mprotect
Giriş
Şu satırı dahil ederiz.
Şu satırı dahil ederiz.
#include <sys/mman.h>
mmap ile bellek alanı ayrılır. Şöyle yaparız.size_t size = ...;
void *ptr = mmap(0, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
if (ptr == MAP_FAILED) {
fprintf(stderr, "%s\n", "mmap failed");
return NULL;
}
unsigned char code[] = {...}
memcpy(memory, code, sizeof(code));
if (mprotect(ptr, size, PROT_READ | PROT_EXEC) == -1) {
fprintf(stderr, "%s\n", "mprotect failed");
return -1;
}
Shared Memory
Posix
Posix ile shared memory kullanmak için yapılması gereken adımlar şöyle.
1. shm_open ile bir bellek yaratılır.
2. ftruncate ile bellek boyutu ayarlanır.
3. mmap ile bellek kendi uygulamamıza dahil edilir.
4. Interprocess mutex ile bellek korunarak sprintf türünden bir metod ile yazma ve okuma işlemi yapılır.
include dosyaları
Metodları kullanabilmek için şu dosyaları dahil etmek gerekiyor.
shm_open() /dev/shm dizini altında bir dosya yaratıyor. Bu dosyanın nereye mount edildiğini görmek için aşağıdaki gibi yapılabilir:
mount | grep shm
Komutun sonucunda şuna benzer bir şey görürüz
shm_open ile verilen shared memory ismi "/filename" kalıbına uymalı.
shm_open bir file descriptor dönüyor. Ancak fd'yi mmap ile kendi sayfamıza almadan kullanmak bir hata.
Dosyayı kapatır. file descriptor değil dosya ismi aldığına dikkat etmek lazım.
Bu metod master uygulama tarafından çağırılır. shm_open ile açılan dosya'nın boyunu ayarlamayı sağlar. Mutlaka yapılması gerekir. Örnek:
Hem master hem de child uygulama tarafından yapılması gerekir. Bu çağrı neticesinde, yaratılan shared memory alanını, kendi uygulamamızda kullanabiliriz. ftruncate çağrısında verilen dosya boyunun aynısını veya daha küçük bir değeri kullanmak gerekir.
mmap yazısına taşıdım
Master Uygulama Örneği
//create shared memory
int shmem_fd = shm_open("/my_shmem",
O_CREAT | O_RDWR, //Yarat ve okuma yazma hakkı al
S_IRUSR | S_IWUSR
);
//truncate memory object
ftruncate(shmem_fd, object_size)
//map shared memory to this process
void *addr = mmap(NULL,
object_size,
PROT_READ | PROT_WRITE, //Okuma ve yazma hakkı
MAP_SHARED, //IPC yapmak istiyoruz
shmem_fd,
0
);
Child Uygulama Örneği
int shmem_fd = shm_open("/my_shmem",
O_RDWR, //Okuma yazma hakkı al
0
);
//map shared memory to this process
void *addr = mmap(NULL,
object_size,
PROT_READ | PROT_WRITE, //Okuma ve yazma hakkı
MAP_SHARED, //IPC yapmak istiyoruz
shmem_fd,
0
);
mmap ve sayfa hizalaması (page alignment)
Bu kısım sadece teorik bilgi. mmap işletim sisteminin sayfaları üzerinde çalıştığı için istenilen hafıza miktarı otomatik olarak sayfa büyüklüğüne göre ayarlanır. Yani bazen istenilenden biraz daha fazla alan kullanılır.
mmap ve lazy initialization
Bu kısım da sadece teorik bilgi. mmap istenilen bellek büyüklüğünü sayfalara dokundukça ayırıyor denilmiş. Yani 4 GB'lik bellek alanı gerektikçe veriliyor.
boost
boost ile shared memory kullanmak için şu adımlar izlenmeli.
1. Önce bir shared memory alanı yaratılmalı. Bu alan bir boost::interprocess::allocator'a verilmeli.
2. boost::interprocess container yukarıda yaratılan allocator ile belleğe erişir.
3. Diğer uygulamalar ile eşzamanlılığı sağlamak için bir interprocess mutex kullanılmalı.
QT
Posix ile shared memory kullanmak için yapılması gereken adımlar şöyle.
1. shm_open ile bir bellek yaratılır.
2. ftruncate ile bellek boyutu ayarlanır.
3. mmap ile bellek kendi uygulamamıza dahil edilir.
4. Interprocess mutex ile bellek korunarak sprintf türünden bir metod ile yazma ve okuma işlemi yapılır.
include dosyaları
Metodları kullanabilmek için şu dosyaları dahil etmek gerekiyor.
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/mman.h>
shm_open ve /dev/shm ilişkisishm_open() /dev/shm dizini altında bir dosya yaratıyor. Bu dosyanın nereye mount edildiğini görmek için aşağıdaki gibi yapılabilir:
mount | grep shm
Komutun sonucunda şuna benzer bir şey görürüz
tmpfs on /dev/shm type tmpfs (rw)
shm_openshm_open ile verilen shared memory ismi "/filename" kalıbına uymalı.
Basit bir örnekIf fildes refers to a shared memory object, the result of the write() function is unspecified.
const char *name = "SHARON";
int shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
shm_unlinkDosyayı kapatır. file descriptor değil dosya ismi aldığına dikkat etmek lazım.
const char *name = "OS";
shm_fd = shm_open(name, O_RDONLY, 0666);
...
shm_unlink(name);
ftruncateBu metod master uygulama tarafından çağırılır. shm_open ile açılan dosya'nın boyunu ayarlamayı sağlar. Mutlaka yapılması gerekir. Örnek:
const int SIZE = 4096;
const char *name = "OS";
int shm_fd;
void *ptr;
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
mmapHem master hem de child uygulama tarafından yapılması gerekir. Bu çağrı neticesinde, yaratılan shared memory alanını, kendi uygulamamızda kullanabiliriz. ftruncate çağrısında verilen dosya boyunun aynısını veya daha küçük bir değeri kullanmak gerekir.
mmap yazısına taşıdım
Master Uygulama Örneği
//create shared memory
int shmem_fd = shm_open("/my_shmem",
O_CREAT | O_RDWR, //Yarat ve okuma yazma hakkı al
S_IRUSR | S_IWUSR
);
//truncate memory object
ftruncate(shmem_fd, object_size)
//map shared memory to this process
void *addr = mmap(NULL,
object_size,
PROT_READ | PROT_WRITE, //Okuma ve yazma hakkı
MAP_SHARED, //IPC yapmak istiyoruz
shmem_fd,
0
);
Child Uygulama Örneği
int shmem_fd = shm_open("/my_shmem",
O_RDWR, //Okuma yazma hakkı al
0
);
//map shared memory to this process
void *addr = mmap(NULL,
object_size,
PROT_READ | PROT_WRITE, //Okuma ve yazma hakkı
MAP_SHARED, //IPC yapmak istiyoruz
shmem_fd,
0
);
mmap ve sayfa hizalaması (page alignment)
Bu kısım sadece teorik bilgi. mmap işletim sisteminin sayfaları üzerinde çalıştığı için istenilen hafıza miktarı otomatik olarak sayfa büyüklüğüne göre ayarlanır. Yani bazen istenilenden biraz daha fazla alan kullanılır.
mmap ve lazy initialization
Bu kısım da sadece teorik bilgi. mmap istenilen bellek büyüklüğünü sayfalara dokundukça ayırıyor denilmiş. Yani 4 GB'lik bellek alanı gerektikçe veriliyor.
boost
boost ile shared memory kullanmak için şu adımlar izlenmeli.
1. Önce bir shared memory alanı yaratılmalı. Bu alan bir boost::interprocess::allocator'a verilmeli.
2. boost::interprocess container yukarıda yaratılan allocator ile belleğe erişir.
3. Diğer uygulamalar ile eşzamanlılığı sağlamak için bir interprocess mutex kullanılmalı.
QT
//Master uygulama içinAşağıda create ve attach metodlarının kodları var.
QSharedMemory sharedMemory(QString("Shared Memory"));//key is Shared Memory
sharedMemory.create(42);//42 byte size
//Slave uygulama için
QSharedMemory sharedMemory(QString("Shared Memory"));//key is Shared Memory
sharedMemory.attach(QSharedMemory::ReadOnly);
11 Şubat 2017 Cumartesi
Sıkıştırma - LZW
Giriş
Lempel, Ziv, Welch Decompression Algorithm olarak bilinir. Açıklaması şöyle. 1984 yılında icat edilmiş.
Açıklaması şöyle.
Açıklaması şöyle.
Açıklaması şöyle
Lempel, Ziv, Welch Decompression Algorithm olarak bilinir. Açıklaması şöyle. 1984 yılında icat edilmiş.
LZW compression is named after its developers, A. Lempel and J. Ziv, withTüm Modern Sıkıştırma Algoritmalarının Atasıdır
later modifications by Terry A. Welch.
Açıklaması şöyle.
It is the foremost technique for general purpose data compression due to its simplicity and versatility. Typically, you can expect LZW to compress text, executable code, and similarEncoding Table
data files to about one-half their original size. LZW also performs well when presented with extremely redundant data files, such as tabulated numbers, computer source code, and acquired signals. Compression ratios of 5:1 are common for these cases. LZW is the basis of several personal computer utilities that claim to "double the capacity of your hard drive."
LZW compression is always used in GIF image files, and offered as an option in TIFF and PostScript.
Açıklaması şöyle.
LZW compression uses a code table, .... A common choice is to provide 4096 entries in the table. In this case, the LZW encoded data consists entirely of 12 bit codes, each referring to one of the entries in the code table. Uncompression is achieved by taking each code from the compressed file, and translating it through the code table to find what character or characters it represents. Codes 0-255 in the code table are always assigned to represent single bytes from the input file. For example, if only these first 256 codes were used, each byte in the original file would be converted into 12 bits in the LZW encoded file, resulting in a 50% larger file size. During uncompression, each 12 bit code would be translated via the code table back into the single bytes. Of course, this wouldn't be a useful situation.KwKwK Problemi
The LZW method achieves compression by using codes 256 through 4095 to represent sequences of bytes. For example, code 523 may represent the sequence of three bytes: 231 124 234. Each time the compression algorithm encounters this sequence in the input file, code 523 is placed in the encoded file. During uncompression, code 523 is translated via the code table to
recreate the true 3 byte sequence. The longer the sequence assigned to a single code, and the more often the sequence is repeated, the higher the compression achieved.
Açıklaması şöyle
The abnormal case occurs whenever an input character string contains the sequence KwKwK, where Kw already appears in the compressor string table. The compressor will parse out Kw, send CODE(Kw), and add KwK to its string table. Next it will parse out KwK and send the just-generated CODE(KwK). The decompressor, on receiving CODE(KwK), will not yet have added that code to its string table because it does not yet know an extension character for the prior string.
6 Şubat 2017 Pazartesi
OpenCV Resim Yükleme Yazma
Giriş
Resim yükleme ve yazma işleleri için imread ve imwrite metodlarını kullanırız. Java'daki kardeşi için Imgcodecs Sınıfı yazısına bakınız.
imencode metodu
ayndepth
< 0 yani resmi olduğu gibi yüklemek için şöyle yaparız.
Örnek 1
= 0 yani resim renkli olsa bile gri olarak yüklemek için şöyle yaparız.
Renkli yükleyip daha sonra grayscale yapmak mümkün. Şöyle yaparız.
color
>0 yani Renkli yüklemek için şöyle yaparız.
Şöyle yaparız.
Resim yükleme ve yazma işleleri için imread ve imwrite metodlarını kullanırız. Java'daki kardeşi için Imgcodecs Sınıfı yazısına bakınız.
imencode metodu
Örnek ver
imread - path
Alışılagelmişin dışında, renkleri RGB yerine BGR olarak yükler. Açıklaması şöyleimread - path
Şöyle yaparız.Note In the case of color images, the decoded images will have the channels stored in B G R order.
cv::Mat image = cv::imread("./sample.png");
imread - path + color
İkinci parametresinin açıklaması şöyleDaha kolay şöyle hatırlarız.CV_LOAD_IMAGE_ANYDEPTH - If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.CV_LOAD_IMAGE_COLOR - If set, always convert image to the color oneCV_LOAD_IMAGE_GRAYSCALE - If set, always convert image to the grayscale one
>0 Return a 3-channel color image. (same as CV_LOAD_IMAGE_COLOR)=0 Return a grayscale image. (same as CV_LOAD_IMAGE_GRAYSCALE)<0 Return the loaded image as is (with alpha channel). (same as CV_LOAD_IMAGE_ANYDEPTH)
< 0 yani resmi olduğu gibi yüklemek için şöyle yaparız.
Mat src = imread("blob.png", -1);
grascaleÖrnek 1
= 0 yani resim renkli olsa bile gri olarak yüklemek için şöyle yaparız.
Mat src = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);
Ya da şöyle yaparız.Mat src = imread("blob.png", 0);
Ya da şöyle yaparız.cv::Mat inputImage = cv::imread("testImage.png", cv::IMREAD_GRAYSCALE);
Örnek 2Renkli yükleyip daha sonra grayscale yapmak mümkün. Şöyle yaparız.
// Load the image
cv::Mat inputImage = cv::imread("testImage.png");
// Convert to single channel (grayscale)
cv::cvtColor(inputImage, inputImage, cv::COLOR_BGR2GRAY);
Tabi bunun yerine direkt grayscale yüklemek daha kolay.color
>0 yani Renkli yüklemek için şöyle yaparız.
Mat im = imread(filename,CV_LOAD_IMAGE_COLOR);
imwrite metoduŞöyle yaparız.
Mat src = ...;
imwrite("test", src);
5 Şubat 2017 Pazar
SQLite String Metodları
String Tanımlama
Tek tırnak içine yazılır. Açıklaması şöyle
Tek tırnak içine yazılır. Açıklaması şöyle
Double quotes are used for identifiers. For string literals use single quotesŞöyle yaparız.
SELECT m.FirstName, m.LastName FROM Master WHERE m.College = 'California'
Şu yanlıştırSELECT m.FirstName, m.LastName WHERE m.College = "California"
Kaydol:
Kayıtlar (Atom)