30 Ocak 2016 Cumartesi

CMMI - DAR Süreci

Giriş
CMMI yazısının Decision Analysis and Report (DAR) hakkında olan kısmını buraya taşıdım. CMMI seviye 3'te  sürecin tüm kurum aynı olması gerekir.

DAR Nedir?
DAR
,  (Türkçesi Karar Analizi ve Çözümleme) CMMI Seviye 3 olan firmaların yapması gereken süreç alanlarından birisidir (process area). Amacı ise kullanılabilecek alternatifleri bir değerlendirme işlemine tabi tutarak, en uygun olanını seçmektir.


Zorunlu DAR Nedir?
Normalde DAR herhangi bir karar için yapılabilir ancak bazı kurumlar, süreçlerini geliştirirken yapılmasını zorunlu kıldıkları DAR'ları tanımlıyorlar.

Süreç tarafından zorunlu olabilecek konu örnekleri:
  1. Kullanılacak RAHAT (Rafta Hazır Ticari Ürün) yazılımın seçilmesi. (COTS software selection)
  2. Kullanılacak RAHAT (Rafta Hazır Ticari Ürün) donanımın seçilmesi.(COTS hardware selection).
  3. Kullanılacak yazılım geliştirme yaşam döngüsü modelinin seçilmesi (Software Development Life-cycle selection)
  4. Altyüklenici seçilmesi (Subcontractor selection)
  5. Mimari seçimi (Architecture selection)
1. DAR ve RAHAT Yazılım
Eğer kullanılabilecek RAHAT yazılım varsa, aralarında seçim yapmak için kullanılır. Örneğin İşletim Sistemi (Linux/Windows), Veritabanı (Oracle, MySql) seçimi için kullanılır.

2. DAR ve RAHAT Donanım
Eğer kullanılabilecek RAHAT donanım varsa, aralarında seçim yapmak için kullanılır. Örneğin Bilgisayar, Modem modeli seçimi için kullanılır.

3. DAR ve Yazılım Yaşam Döngüsü Modeli
Normalde kurumun süreci projeye özel olmamalıdır. Böylece çalışanlar süreci kolayca anlayıp her projeye daha iyi uyum sağlarlar. Ancak bazen projeye özgü yaşam modeli seçmek gerekebilir. DAR bu yüzden yapılır.

4. DAR ve Altyüklenici Seçilmesi
Altyükleniciler aralarında seçim yapmak için kullanılır.

5. Yazılım Mimarisi DAR
Diğer mimari seçeneklerinin değerlendirildiği ve alınan kararların neden alındığının açıklandığı bir belge olması beklenir. Burada bence en zor kısım "diğer" seçeneklerin değerlendirilmesi. İnsanın "diğer" mimarileri iyi bilmesi ve kullanmış olması gerekiyor ki artı ve eksileriyle mukayese edebilsin. Ancak bir çok "yazılım mimarının" zaten bu kadar tecrübesi olmadığı için, mukayese bence hakkının vererek yapılamıyor.

Zorunlu DAR İçinde Neden Geliştirme Ortamına Ait Bir Şey Yok 
Bence yazılım firmalarının en büyük eksikliği bu. Nadiren de olsa bazı firmalar bu gibi durumlarda da DAR yapıyor, ancak çoğu  zaman yazılıma ait önemli kararlar - mesela hangi framework'ün kullanılacağı - hem bir bilene sorularak seçiliyor.

DAR Kriterlerinin imzalanması
Bazı kurumlar süreçlerini DAR kriterlerini belirledikten sonra, DAR ekibi tarafından imzalanması şeklinde tasarlamışlar. 

DAR ve Puanlama
Kriterlere göre puanlama yapılıyor.Yapılan puanlamalar neticesinde en uygun alternatif seçiliyor.

DAR Waiver Formu
Zorunlu olan bir DAR yapılmayacaksa gerekçesi bu forma yazılır. Genellikle gerekçe olarak

RAHAT Donanım
DAR için harcanacak efor, ürünün kendisinden çok daha maliyetli olacağı için DAR yapılmadı.

Yaşamsal Döngü Modeli
Default kurum süreci kullanılacağı için DAR yapılmadı

Yazılım Mimarisi DAR
Tekrar kullanılacak yazılım mimarisi olduğu için DAR yapılmadı.

gibi gerekçeler yazılabilir.

Sonuç
Bu süreç alanı anlaması ve uygulaması en kolay şeylerden birisi. Proje alternatifler ve seçimler silsilesi olarak düşünülürse aslında bu süreç alanı CMMI olmayan projelerde bile bilinçli veya bilinçsiz şekilde zaten uygulanıyor.

Birçok süreç alanı için piyasada çok çeşitli yazılımlar bulunmakta ancak DAR kayıtlarını basit bir excel tablosu olarak tutmanın bile yeterli olduğunu düşünüyorum.

29 Ocak 2016 Cuma

C Veri Tipleri

stdint.h İle Gelen Tipler
C++ ile bu dosya içindeki tipler için specifier'lar sıraya bakılmaksızın kullanılabilir.
3 When multiple simple-type-specifiers are allowed, they can be freely intermixed with other decl-specifiers in any order.
Yani şu tanım doğrudur. long long tipi araya serpiştirilerek tanımlanıyor.
constexpr long static long const int signed x = 10;
C dilinde ise qualifier birden fazla tanımlansa bile sorun olmuyor.
5 If the same qualifier appears more than once in the same specifier-qualifier-list, either directly or via one or more typedefs, the behavior is the same as if it appeared only once....
Yani şu tanım doğrudur. İki defa const yazsak bile sorun olmuyor.
const long const long static const int const signed x = 10;

Sabit Büyüklükte Veri Tipleri
Okumayı kolaylaştırmak için, yazıya önce hep aynı büyüklükte olduğu garanti edilen veri tipleri ile başlamak istedim. Bu tipler stdint.h dosyasında tanımlı. Bu veri tipleri signed olanlar için intN_t unsigned olanlar içinse uintN_t şeklinde tanımlanıyor.

int8_t : genellikle typedef  const signed char int8_t olarak tanımlanır. Bir byte büyüklüğündedir
int16_t:
int32_t:
int64_t : 8 byte büyüklüğündedir. printf yapmak için aşağdaki gibi yapmak gerekir.

Büyüklüğü en az belli bit olması garanti edilen tipler
stdint.h dosyasında int_leastN_t şeklinde tanımlanıyorlar. Örneğin int_least8_t gibi. Bu veri tiplerinin kullanıldığı hiç bir yer görmedim ancak şöyle bir örnek verilebilir. Nadir görülen unsigned int'in 20 bit olduğu bir mimarimiz olsun. Bu mimaride

uint8_t : tanımsızdır.
uint_least8_t : 10 bit'lik char ile aynıdır
uint_fast8_t : muhtemelen unsigned int ile aynıdır.

Eğer bu tür egzotik mimariler ile çalışıyorsak uint_least8_t kullanılabilir.

Büyüklüğü en az belli bit olması garanti edilen tipler. Derleyici en hızlı olanını seçer
stdint.h dosyasında int_fastN_t şeklinde tanımlanıyorlar. Örneğin int_fast8_t gibi. Derleyici en az 8 bitlik bir değer seçer. Eğer 16 bit daha hızlı çalışacaksa 16 bitlik bir değer seçer. (an integral type, which is computed quickly, of at least 8 bits, but it could be 16 bits if they run faster, etc...) Bu veri tiplerinin kullanıldığı hiç bir yer görmedim.

int "most efficient" tiptir. int_fastN_t ise "most efficient type in speed"tiptir.

(7.20.1.3p2) "The typedef name int_fastN_t designates the fastest signed integer type with a width of at least N. The typedef name uint_fastN_t designates the fastest unsigned integer type with a width of at least N."

Dil İle Gelen Tipler

Değişken Büyüklükte Veri Tipleri
C ile gelen veri tipleri platform ve derleyiciye göre değişebiliyor.

Data Type Ranges(C++) sayfasında bazı örnekler var. Ayrıca C Data Types sayfası da faydalı.
Tablo

Type          | Storage size |  Value range
____________________________________________________________
char          | 1 byte       |  -128 to 127 or 0 to 255
unsigned char | 1 byte       |  0 to 255
signed char   | 1 byte       |  -128 to 127
int           | 2 or 4 bytes |  -32,768 to 32,767 or -2,147,483,648 to 2,147,483,647
unsigned int  | 2 or 4 bytes |  0 to 65,535 or 0 to 4,294,967,295
short         | 2 bytes      |  -32,768 to 32,767
unsigned short| 2 bytes      |  0 to 65,535
long          | 4 bytes      |  -2,147,483,648 to 2,147,483,647
unsigned long | 4 bytes      |  0 to 4,294,967,295
Benim anladığım C veri tipleri şu şekilde sınıflandırılabilir:

char başlığı altına düşenler
Bir byte olması gerekiyor. Şu cümle C++ standardından alıntı
sizeof(char), sizeof(signed char) and  sizeof(unsigned char) are 1.
int8_t veya uint8_t aynı şeyler. En büyük ve en küçük değerleri SCHAR_MIN ve SCHAR_MAX macroları ile almak mümkün. SCHAR_MIN -128 SCHAR_MAX ise 127'dir.

Boolean aslında bir bit olması gerektiği halde, işlemci register'ları 1 bit ile çalışmadığı için genellikle bir byte'lık bir veri tipi ile tanımlanır.

short başlığı altına düşenler
short  : en az 2 byte olması gerekiyor, genellikle de zaten 2 byte oluyorlar.

int başlığı altına düşenler
int (unsigned int vs.) : en az 2 byte olması gerekiyor. Ancak genellikle 4 byte oluyorlar. En büyük ve en küçük değerleri INT_MIN ve INT_MAX macroları ile almak mümkün. Unsigned en büyük değeri ise UINT_MAX macrosu ile alabiliriz. Buradaki soruda bir işlemcinin 2 byte'lık int'lere sahip olmasına örnek var.

long başlığı altına düşenler
long (long int, unsigned long vs.) : en az 4 byte olması gerekiyor, genellikle de zaten 4 byte oluyorlar. En büyük ve en küçük değerleri LONG_MIN ve LONG_MAX macroları ile almak mümkün. Unsigned en büyük değeri ise ULONG_MAX macrosu ile alabiliriz.

Not : gcc 32 bit için long'u 4 byte, 64 bit içinse 8 byte olarak tanımlıyor, Windows'ta hep 4 byte uzunluğunda.

long long başlığı altına düşenler
long long (unsigned long long ) : en az 4 byte olması gerekiyor. Genellikle  8 byte oluyorlar.
En büyük ve en küçük değerleri LLONG_MIN ve LLONG_MAX macroları ile almak mümkün. Unsigned en büyük değeri ise ULLONG_MAX macrosu ile alabiliriz.

Sabitleri yazarken aşağıdaki gibi yazmak lazım.
1LL << 40

Eğer sistemde long long tanımlı değilse aşağıdaki gibi tanımlanabilir. upper kısmı en büyük unsigned long ile çarpılarak daha büyük bir sayı elde ediliyor.

typedef struct longlong
{ unsigned long lower; long upper; }
longlong;

#define ToDouble64(ll)    /* Convert to a double.  */    \
    ((ll).upper * 4294967296.0 + (ll).lower)

8 byte'lık veri tipleri eğer unsigned ise 0 ve 18,446,744,073,709,551,615 arasında değer alabiliyor.
8 byte'lık veri tipleri eğer signed ise −9,223,372,036,854,775,808 ve +9,223,372,036,854,775,807 arasında değer alabiliyor.

printf yapmak için %lld veya %llu seçeneğini kullanmak gerekir.

printf("%lld", (long long)now);

Open GL
Eğer OpenGL gibi bir kütüphane ile uğraşıyorsak bazı veri tiplerinin hep aynı büyüklükte olması için kendi veri tipini kullanmak lazım.

GLuint : Her zaman 4 byte


28 Ocak 2016 Perşembe

Ortam Değişkenleri

Giriş
Ortam değişkenleri uygulamaya ana uygulama tarafından geçilir ya da uygulama kendi değişkenlerini yönetebilir. Yani her uygulamanın kendi ortam değişkenlerini sakladığı bir bellek alanı vardır.

Ortam Değişkenlerini Listelemek
Windows'ta "set" komutu ile ortam değişkenleri listelenebilir. Linux'ta ortam değişkenleri şöyle görülebilir.
cat /proc/<pid>/environ

C
getenv(), setenv() için şu satır dahil edilir.
#include <stdlib.h>
getenv
Metodun imzası char * döndürüyor. Aslında const char * döndürseydi daha iyi olurdu. Çünkü döndürülen bellek alanını değiştirmemek gerekir.

Bu çağrı ile tanımlı değişken varsa char * olarak alınır. Yoksa NULL döner. Şöyle kullanılır.
char key [30];
scanf("%s", key);
if(getenv(key) != NULL)
  printf("%s\n", getenv(key));
putenv
Bu çağrının imzası aşağıdaki şöyle. putenv() artık kullanılmamalı. Onun yerine setenv() kullanılmalı.
Örnek:

setenv


Örnek yaz.

Java

System.getProperty()
Java'da JVM çalıştırılırken -DKey=Value şeklinde geçilen seçenekleri
String value = System.getProperty("Key");
alabilme imkan var.

26 Ocak 2016 Salı

C Programlarının Hafıza Yerleşimi

Not : Konu ile ilgili olarak Segmentation Fault başlıklı yazıya bakabilirsiniz.

C Programlarının Hafıza Yerleşimi
Uygulama yüklendiğinde bellek bir çok sayfaya ayrılır . Şimdi sayfaların çeşitlerine bakalım.

Not : Assembly Kodu
Assembly yazarken de benzer sayfaları görebiliriz.
SECTION .data          ; Section containing initialised data
...
SECTION .bss           ; Section containing uninitialized data 
...
SECTION .text          ; Section containing code

Salt Okunur Sayfalar - Read Only Segment
Bu .init, .text, .rodata sayfaları salt okunur oluyorlar.

.Text Sayfalar
Bu alan programın çalıştırılabilir makine kodunun saklandığı alandır. Code Segment olarak ta anılır.

.RoData
Read Only Data anlamına gelir. Kodun içindeki const değişkenlerdir.
const char *foo = "foo";
const int bar = 234;
Bu tür değişkenlerin değeri değiştirilmeye kalkılırsa uygulama hata verir.

.rodata normalde ram'de olur. Gömülü ortamda flash bellekte olsun istersek şöyle yaparız.
__attribute__((section(".flash.rodata"))) ...

Okunup Yazılabilir Sayfalar - Read/Write Segment
bss - ilklendirilmemiş veri
bss block started by symbol anlamına gelir. İlk değeri atanmamış değişkenler burada saklanır.
"The BSS segment, also known as uninitialized data, is usually adjacent to the data segment. BSS segment contains all global variables and static variables that are initialized to zero or do not have explicit initialization in source code."
.data - ilklendirilmiş veri
İlk değer atanmış değişkenler burada saklanır.

"The data area contains global and static variables used by the program that are explicitly initialized with a non-zero (or non-NULL) value. "

7 Ocak 2016 Perşembe

Apache POI ve Excel

Aşağıda Apache POI ile ilgili aldığım notlar bulunuyor.
  • XSSFWorkbook xlsx formatındaki dosyaları okumak/yazmak için kullanılıyor.
  • org.apache.poi.ss.usermodel  paketi çoğu sınıf için arayüzleri içeriyor. Bu arayüzleri kullanan diğer sınıflar org.apache.poi.hssf.usermodel veya org.apache.poi.xssf.usermodel paketlerinde bulunuyor.
Bir çok örnek te http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/ConditionalFormats.java sayfasında mevcut.

WorkbookFactory
Dosya okuma veya yazma için bir Workbook açmak lazım. Bu HSSFWorkbook veya XSSFWorkbook olabilir.
  • POIFSFileSystem veya NPOIFSFileSystem sınıfları HSSFWorkbook formatında dosya açıyor. HSSFWorkbook eski Excel formatı olduğu için artık pek kullanılmıyor.
  • OPCPackage ise XSSFWorkbook formatında dosya açıyor.
Close Filehandle for Workbook (apache poi) sorusunda her bilinmeyen bir formattaki excel dosyasını açma örneği var.

Workbook
constructor
Workbook nesnesi yaratmak için stream vermemiz yeterli.
FileInputStream fin = new FileInputStream(new File("C:\\A2015.xlsx"));
XSSFWorkbook wb = new XSSFWorkbook(fin);
removeSheetAt
Örnekte ismi kritere uymayan sheet'ler siliniyor. Silmeye tersten başlamak lazım.
void removeOtherSheets(String sheetName, XSSFWorkbook book) {       
  for(int i=book.getNumberOfSheets()-1;i>=0;i--){
    XSSFSheet tmpSheet =book.getSheetAt(i);
    if(!tmpSheet.getSheetName().equals(sheetName)){
      book.removeSheetAt(i);
    }
  }       
}

XSSFSheet
Bu nesne WorkBook tarafından verilir.
XSSFSheet sheet = wb.getSheetAt(0);
Iterator
Bir sheet şöyle dolaşılır.
Iterator<Row> rowIt = sheet.rowIterator();
while (rowIt.hasNext()) {
  XSSFRow row = (XSSFRow) rowIt.next();

  // iterate through Columns
  Iterator<Cell> colIt = row.cellIterator();
  while (colIt.hasNext()) {
    Cell cell = colIt.next();
    System.out.println(cell.toString());
  }
  System.out.println();

}
Şöyle de dolaşılabilir. Bu dolaşmada null satırları atlamış oluruz.

for (Row row : sheet) {
  Cell cell = row.getCell(0);
  if (cell != null) {...}
}

Cell
toString metodu
Cell'in taşıdığı değeri string olarak döndürür.

Dosya Okuma 
xlsx Formatındaki Dosyayı Okumak
1. WorkbookFactory.create(OPCPackage pkg) metodunu kullanmak
Burada WorkBookFactory aslında XSSFWorkbook sınıfını yaratıyor.

FileInputStream fileInputStream = new FileInputStream(fileName);
//OPCPackage unzips .xlsx in order to read the xml
Workbook workBook = WorkbookFactory.create(OPCPackage.open(fileInputStream));
Sheet sheet = workBook.getSheetAt (0);

2. WorkbookFactory.create(InputStream inp) metodunu kullanmak
File inputFile = new File(fileName);
Workbook wb = WorkbookFactory.create(new FileInputStream(inputFile));

3. Arayüz kullanmadan XSSFWorkbook constructor metodlarından birisini kullanmak.

Şifre ile Korunan Bir Dosyayı Okumak
Burada bir örnek var.

xlsx Formatındaki Büyük Dosyayı SAX Parser Kullanarak Okumak
Gördüğüm en iyi örnek burada. XSSFReader sınıfını açıklayan örnek ise burada.

Okurken dikkat edilmesi gereken nokta ReadOnlySharedStringsTable sınıfı kullanılarak XSSFSheetXMLHandler sınıfına XML içindeki paylaşılan stringlerin geçilmesi. Bu tablo xlsx dokümaındaki \xl dizini altında bulunan sharedStrings.xml dokümanını kullanıyor.

 
xls Formatındaki Dosyayı Okumak
How do you get a cell's content in an Excel spreadsheet using Java? Apache POI  sorusuna verilen cevap aşağıda.

getNumberOfSheets metodu
Bu metod ile tüm sayfaları dolaşma imkanı var.
 

getCell metodu
Bu metodu kullanırken boş hücreler için aşağıdaki gibi Row.RETURN_BLANK_AS_NULL kullanabiliriz.

Dosyayı CellReference ile Okumak
getRow() ve getCell() metodları indeks olarak 0'dan başlayan sayılar alırlar. Ancak Excel'deki hücreler 1'den başlayan sayı alırlar. Örneği buradan aldım.

İsim verilen CellReference Aralıkları
Excel'de bazı hücre aralıklarına isim verilebiliyor. Bu isimleri görmek için aşağıdaki örneği kullanabiliriz.
XSSFName[] ranges = new XSSFName[workbook.getNumberOfNames()];
for (int i = 0; i < _wb.getNumberOfNames(); i++)
    ranges[i] = workbook.getNameAt(i);
   
AreaReference area = new AreaReference(ranges[0].getRefersToFormula());
//get all the cells within that range
CellReference[] cells = area.getAllReferencedCells();   
Dosyanın Tamamını Dolaşmak
Örneği buradan aldım. Burada dikkat edilmesi gereken nokta boş hücrelerin bazen xls dosyasına yazılmaması. Bu gibi durumlarda iterator yerine index kullanmak daha iyi. Buradaki soruda benzer bir cevap bulabilirsiniz
String fname = "C:\\myExcel.xlsx";
InputStream inp = new FileInputStream(fname);
Workbook wb = WorkbookFactory.create(inp);
Sheet sheet = wb.getSheetAt(0);

Iterator rows = sheet.rowIterator();
StringBuilder sb = new StringBuilder();
while (rows.hasNext()) {
    Row row = (Row) rows.next();
    Iterator<Cell> cells = row.cellIterator();
    while (cells.hasNext()) {
        Cell cell = cells.next();
        sb.append(cell.toString()).append(";");
    }
    sb.append("\n");
}
inp.close();
Dosyadaki Resimleri Okuma
Örnek:

Dosya Yazma
Büyük Dosyaları Yazma
Büyük dosyalar üretmek için http://poi.apache.org/spreadsheet/how-to.html adresinde örnek verildiği gibi SXSSFWorkbook sınıfını kullanmak lazım. Zaten bu sınıfın açıklamasında da "Streaming version of XSSFWorkbook implementing the "BigGridDemo" strategy. " yazıyor.


Eğer SXSSFWorkbook okuma işlemi için kullanılırsa burada gösterildiği gibi exception alırız.

Bir Dosya Oluşturma
Workbook workbook = WorkbookFactory.create(new File("file.xlsx"))
Boş bir dosya oluşturmak için aşağıdaki kod da kullanılabilir. openOrCreate() metodunun kullanıldığına dikkat etmek lazım.
OPCPackage opcPackage = OPCPackage.openOrCreate(file)
wb = new XSSFWorkbook(opcPackage);

Dosyaya AutoFilter Oluşturma
Örneği buradan aldım. İlk hücre başlığın olduğu yerden başlamalı ve son hücreye kadar devam etmeli.
sheet.setAutoFilter(CellRangeAddress.valueOf("A1:D10")); 

Bir Hücreye String Değer Atamak
SXSSFWorkbook workbook;//Yukarıdaki gibi oluştur
Sheet sheet = workbook.createSheet("sheet1");
Row row = sheet.createRow(9);//10. satır
Cell cell = row.createCell(3);//4 sütun
cell.setCellValue("label");
Bir Hücreye Sayısal Değer Atamak
Cell cell = row.createCell(3, Cell.CELL_TYPE_NUMERIC);//4 sütun
cell.setValue (100);
Bir Hücreye Formül Atamak
Cell cell = row.createCell(3, Cell.CELL_TYPE_FORMULA);//4 sütun
cell.setCellFormula ("SUM(D3:D4)");
Formüllerde $ işareti arkasındaki satır/sütun veya sayısı mutlak hale getirir. Örneğin $A1 formülü kopyalansa bile A sütunu sabit kalır. $A$1 şeklindeki kullanımda ise A1 hücresi sabit kalır.

Hücreye Style Atama
Hücreden Workbook'a Erişme
CellStyle nesnesi sadece Workbook tarafından yaratılabiliyor. Eğer Cell arayüzünden Workbook arayüzüne erişmek istersek aşağıdakine benzer bir kod kullanabiliriz.
CellStyle newCellStyle = newCell.getSheet().getWorkbook().createCellStyle();
Style Nesneleri 1 Kere Yaratılmalı
Bunun sebebini bilmiyorum ancak Style nesneleri bir kere yaratılmalı ve gerekirse bir yerde saklanmalı.

Style Nesneleri Hücrelere Atanmalı
Eğer bir satıra style atanırsa ve daha sonra o satırda bir hücre yaratılırsa, yeni hücre içinde bulunduğu satırın style'ını devralmaz. Hücreye style tekrar atanmalıdır.

Bir Hücreye Arka Plan Rengi Atamak
CellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());//yeşil renk
headerStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
Eğer istenirse indekslenmemiş bir renk te atanabilir. Örnek :
CellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillForegroundColor(new XSSFColor(new Color(255, 255, 255)));//siyah renk
headerStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
Bir Hücreye Font Atamak
//create font
Font headerFont = workbook.createFont();
headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
headerFont.setFontHeightInPoints((short) 12);

//create ceyll style
CellStyle headerStyle = workbook.createCellStyle();
style.setFont(headerFont);

Cell cell = //create cell
cell.setCellStyle(headerStyle);
Formüller
FormulaEvaluator
Bir çok hücredeki değerleri değiştirdikten sonra tüm formülleri yeniden hesaplamak için aşağıdaki gibi yapabiliriz.