Salı, Ocak 18, 2011

kartaca'ya geçtim

kartaca parkyeri çatısı altında kurulmuş bir şirket. askerden döndüğümde yine parkyeri çatısı altında kurulan bir diğer şirket zeitin'de çalışmaya başlamıştım. zeitin parkyeri'nden sermaye alınarak kuruldu, kartaca ise parkyeri'nin hali hazırda yaptığı projeleri devraldı.


zeitin sonrasında mynet'e geçiş hikayemi şu blog girdimde özetlemeye çalışmıştım.

mynet'te geçen mutlu 1.5 yılın ardından çok da kolay olmayan bir kararla kartaca'ya geçerek parkyeri çatısı altına geri dönmüş oldum.

aslında çok "geri dönmek" denilemez, çünkü her ne kadar kartaca parkyeri'nin işlerini devralmış olsa da iş yapış yöntemleri olarak kendine bambaşka bir yol çizmiş durumda. takımlar ve hedefler üzerine kurulu yeni bir düzen getirilmiş.

mynet'te gerek yaptığım işten tatmin olmam gerekse iş arkadaşlarımla mutlu olmam geçiş kararımı oldukça güçleştirdi. bu kararı kendimce şu nedenlere dayanarak rasyonalize ettim:
  • gelir ve gelir arttırma konuları
  • sistem mühendisliğine geçme isteğim
  • eğitim bütçesi olması
  • seminerlere katılım/seminer verme teşviği
  • özgür yazılım dünyasına yakınlık
  • bir kütüphanesinin olması
  • bedava çikolata
  • teknoloji şirketi olması
  • şirket etiği ve vizyonunun olması
gelir ve gelir arttırma konuları: kartaca'nın şu anda bana sunduğu şartları mynet sunamadı. mynet'te geliştirici pozisyonu için belirlenmiş bir maaş seviyesi mevcut, bu seviyenin üzerine çıkamıyorsunuz, yazılım tarafında da oturmuş bir yönetim kadrosu olduğundan terfi gibi bir durum da söz konusu değil, dolayısıyla gelirimi arttırma konusunda biraz önüm kapanmıştı. bu açıdan kartaca'da geleceğimin daha parlak olacağını düşündüm, büyümekte olan bir firmaya zamanında yapılan bir geçiş olacağı kararını verdim.

sistem mühendisliğine geçme isteğim: askerlik sonrası aldığım bir kararı 3 yıl sonra uygulama şansım olacaktı. bunu aslında mynet'te de yapabilirdim, ama mynet'te sistem tarafında mutlu olabileceğime dair şüphelerim vardı, sistem tarafının dünyası ile yazılım tarafının dünyası bambaşka mynet'te. 1.5 yılda mynet'te 3 defa mesaiye kalmışlığım ya vardır ya yoktur, sistemde ise insanların sürekli mesai yapıyor olması gibi sebepler geçiş yapmama engel oluyordu. kartaca'ya geçişim ile birlikte ruslar sıcak denizlere inemeden ben sistem mühendisliğine geçebildim ve hatta yeni sıfatımı da kendimce belirledim: "Site Güvenilirlik Mühendisi (Site Reliability Engineer - SRE)". "yazılım geliştiricisi" sıfatıyla proje yöneticisi veya müdür olmadan maaşınızı arttırmanız çok mümkün değil malesef, insan yönetmekten uzak durmak ve işin mutfağında kalmak isteyen bir insan olarak yeni sıfatımın amaçlarıma daha iyi hizmet edeceğini düşünüyorum. ve her zaman yazılım geliştirmeye hobi olarak devam edebilirim.

eğitim bütçesi olması: kartaca'da herkesin bir eğitim bütçesi kumbarası var, aylık 100$ atılıyor bu kumbaraya. kendi seçtiğin herhangi bir eğitim için bu bütçeden faydalanabiliyorsun. açıkcası sırf bu bütçeden faydalanayım diye muhtelif sertifikaları toplamayı düşünüyorum yavaş yavaş. normalde maaş olarak verseler bana bu parayı eğitim bütçesi adı altında, eğitime harcamazdım muhtemelen, bu şekilde olunca ağaç zorla eğilmiş oluyor. şirketinin eğitimini düşünüyor olması ve alacağın eğitim konusunda da seni özgür bırakıyor olması güzel bir şey.

seminerlere katılım/seminer verme teşviği: çalışanları seminer versin/alsın diye ittiren bir şirket olması.

özgür yazılım dünyasına yakınlık: parkyeri ve çatısı altında kurulan şirketler hep türkiye'deki özgür yazılım camiasının yanında olmuştur, maddi ve manevi olarak. bu da güzel bir çevre edinme şansı veriyor insana.

bir kütüphanesinin olması: bunun değerini kaybedince anladım. okuduğu kitabı bir daha okumayan bir insan olarak kitap biriktirme işini hep anlamsız bulmuşumdur. okurken itu'nun, çalışırken de parkyeri'nin kütüphanesini sömürdüğümden mynet'e geçince bir boşluğa düştüm. kitaba para vermek, evde kütüphane oluşturmak gibi yeni kavramlar girdi hayatıma. kartaca'da teknik olsun/olmasın istediğiniz kitabı söylüyorsunuz alıyorlar. kitap dışında yurt içi/dışı birçok derginin üyeliğinden de faydalanabiliyorsunuz. teknik olarak herhangi bir konuda bir kitaba ihtiyacınız olduğunda, aradığınız kitabı daha önce birilerinin sipariş etmiş olmasının hazzı bambaşka birşey. teknik olmayan kitaplar da kitap okuma faaliyetini sosyal bir hale dönüştürmesi nedeniyle önemli.

bedava çikolata: mynet'te maaşımızın bir kısmını yatırdığımız gündelik "saat 5" çaylarımız vardı, bu molalarımızda en çok aradığım şey parkyeri'ndeki bedava abur cubur/içeçek dolabımız olurdu. böylece hep insanlara bahsini ettiğim dolabıma kavuşmuş oldum. Böyle uygulamalar şirketler için çok önemli, çok fazla bir maliyet yaratmadan çalışanlarınızın kalbini fethetmenin en kolay yolu.

teknoloji şirketi olması: bir şirketin teknoloji satıyor olması ile kullanıyor olması apayrı şeyler. kartaca doğrudan adam-gün satıyor, dolayısıyla şirketin pazarladığı doğrudan çalışanlarının teknik yetenekleri ve şirkette birikmiş olan bilgi. dolayısıyla ben bilgimi ve yeteneklerimi arttırdığım sürece şirketin değeri de artmış oluyor. doğrudan bir kazan-kazan ilişkisi söz konusu. mynet ise üyelik ve reklam gelirleriyle ayakta duran bir şirket. teknik adam olarak şirketin başarısındaki rolünüz biraz daha küçük oluyor bu durumda. yarın bir gün mynet tüm teknik işlerini rahatlıkla taşeronlaştırabilir mesela, ama kartacanın varoluş sebebi barındırdığı teknik personel.

şirket etiği ve vizyonunun olması: askerliğim öncesi parkyeri'nde bir vizyon/misyon belirleme çalışması yapmıştık. kartaca bu çalışmanın çıktısını sahiplenmiş ve bu yolda köklü değişiklikler yapmış. şirket bir yandan ayakta durabilmenin gereklerini yerine getirebilirken bir yandan da belirlediği vizyon doğrultusuna ilerlemeyi başarabilmiş. ve bunlar başarılırken parkyeri zamanında benimsenmiş etik değerler korunabilmiş. kartaca için çok rahatlıkla şunları söyleyebilirim: çalışanın sosyal haklarını gasp etmez (stajyerlere bile sigorta yapılıp, maaş bağlanır, kartaca çapında bunu yapan başka şirket olduğunu sanmıyorum türkiye'de), vergi kaçırmaz, kaçak yazılım kullanmaz, yasa dışı iş yapmaz. türkiye'de bunları kendi şirketi için şüphe etmeden söyleyebilecek kaç çalışan var?

php'de MCRYPT_3DES ve MCRYPT_MODE_CBC ile şifrelemenin java'daki karşılığı

php'de TripleDES şifreleme algoritması ile CBC mod kullanarak ürettiğiniz şifrelenmiş sözcüğün aynısını java'da üretmek için internette arandığınızda karşınıza iki anahtar sözcük çıkacaktır:

  • DESede (algoritma olarak)
  • DESede/CBC/PKCS5Padding (dönüşüm metodu)
burada yanıltıcı olan dönüşüm metodu, php "PKCS5Padding" desteklemediğinden şifrelemek için verdiğiniz sözcüğün sonuna, kendince, 8'in katı kadar karakter sayılı hale getirecek şekilde boş karakterler ekliyor. Dolayısıyla java'da da dönüşüm metodu olarak "DESede/CBC/NoPadding" kullanıp, eksik karakter hatası[1] almamak için de php'nin yaptığını elle yapmanız gerekli.

aşağıdaki şifreleme için kullanılan php kodunun java karşılığını daha da aşağısında bulabilirsiniz.

PHP:

$plaintext = "Some-plain-text-message-to-be-symetrically-encrypted";
$deskey = "secret word with 24 byte";
$ivkey = "12345678";
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, $deskey, $ivkey);
$encrypted_data = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
echo strtoupper(bin2hex($encrypted_data));
mcrypt_module_close($td);


JAVA:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import org.apache.commons.codec.binary.Hex;
import java.util.Date;
import java.util.Arrays;
import java.text.SimpleDateFormat;
import java.text.ParsePosition;

public class Encrypt {

public static void main(String[] args) throws Exception {
String plainText = "Some-plain-text-message-to-be-symetrically-encrypted";
String desKey = "secret word with 24 byte";
String ivKey = "12345678";
String algorithm = "DESede";
// String transformation = "DESede/CBC/PKCS5Padding";
String transformation = "DESede/CBC/NoPadding";
byte[] keyValue = desKey.getBytes("UTF-8");
byte[] ivValue = ivKey.getBytes("UTF-8");
DESedeKeySpec keySpec = new DESedeKeySpec(keyValue);
IvParameterSpec iv = new IvParameterSpec(ivValue);
SecretKey key = SecretKeyFactory.getInstance(algorithm).generateSecret(keySpec);
Cipher encrypter = Cipher.getInstance(transformation);
encrypter.init(Cipher.ENCRYPT_MODE, key, iv);
// byte[] input = plainText.getBytes();
byte[] input = getPaddedBytes(plainText);
byte[] encrypted = encrypter.doFinal(input);
System.out.println(new String(Hex.encodeHex(encrypted)).toUpperCase());
}

public static byte[] getPaddedBytes(String s) throws java.io.UnsupportedEncodingException {
int n = s.length();
n = n + (8 - (n % 8));
byte[] src = s.getBytes("UTF-8");
byte[] dst = Arrays.copyOf(src, n);
return src;
}
}



[1] javax.crypto.IllegalBlockSizeException: Input length not multiple of 8 bytes