5 Kasım 2016 Cumartesi

Don't forget to turn forward your clock for Daylight Saving Time !

Lots of jokes about time were flying around due to annual changes on DTS compliance (!) of my beloved country. Finally it is decided to be on GMT+3. I had to take care of my iPhone, squeeze box, laptop etc. Off the record, I prepared my full mechanic watch for 2 days not to miss the time :).

The DTS thing always should be considered by the owner of any product that depends on java. Although the owners of jdk and the other time related libraries publish a patch or version, they are mostly being one step behind the governments.

As of today, i have faced to problems of my clients on various system jdks and even on my MacBook !. Of course there is a solution - but not trivial - for the problem and i was trained on the subject before for some reason.

May be some systems can easily be upgraded to the latest timezone but my MacBook did not let things to go that way. Let me explain my journey.

I will go step by step:
  1. If you google a bit you will find the oracle web site about tzupdater and procedure of update process. Download the tzupdater.jar. 
  2. Internet Assigned Numbers Authority (IANA) is preparing  and distributing the timezone data. Copy the link of the data file tzcode2016i.tar.gz.
  3. According to the document it is ok if you can execute command                                            java -jar tzupdater.jar -l http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz
  4. but not ! Because there is a bug. Do not make it a big problem if your code has bugs, and tell about this if any one complain about your bugs !
  5. Then read the Version issue since tzdata 2016g release" section of the oracle document and recreate the gz file after downloading, extracting and modifying. I created and named the new file as 2016i.tar.gz. Be careful while creating the tar, because the tar should be crated as all the files included in root, no directory permitted inside. It is done by executing tar in the folder where files resides. See this.
  6. And than execute the command as below (replay the path with your real path):                    sudo java -jar tzupdater.jar -v -l file:///Users/xxx/xxx/xxx/2016i.tar.gz                                     to get the next step of bugs. 
  7. This one is related with sh512, as details explained on Version Issues section. From this site download the gui application and generate the sh512 hash code of the 2016.tar.gz. Create a new file text file with name 2016.tar.gz.sha512. Put the hash code as one line in the file and place the file at the same path with 2016.tar.gz.  Lets re-execute the command :                             sudo java -jar tzupdater.jar -v -l file:///Users/xxx/xxx/xxx/2016i.tar.gz
  8. if you are lucky enough, your timezone information is updated successfully. But if you get and error of "Error. SHA-512 hash for downloaded bundle does not match expected SHA-512 hash" do not panic, the clever developer guys of the tool are dumping you the real hash key if your key does not match with the one you provided.                                                              Error. SHA-512 hash for downloaded bundle does not match expected SHA-512 hash.   Expected  : 5FA87187DCB57FA1C3FF632B65B37B4C9F00990075832423DB886D18A8774595556709A19E79327F8C52B6F311695B49935862917045DF9234D6E5409FA8F209                Calculated : 5fa87187dcb57fa1c3ff632b65b37b4c9f00990075832423db886d18a8774595556709a19e79327f8c52b6f311695b49935862917045df9234d6e5409fa8f209                                                         (if you released that my hash was just the same key with characters in uppercase.)
  9. copy the calculated key and replace yours with new key then execute the command again !
          Bingo ! Enjoy your new timezone data.

Special Note For Jodatime users: For the ones using jodatime life is much more. Although the library is not using the same tz data with idk, they are more rapid than the jdk releases and they released the version 2.9.5 two days ago including timezone update to 2016i :)

19 Nisan 2012 Perşembe

SnowLeopard 10.7.3 üzerinde SonicWall NetExtender SSL-VPN sorunları

Yaklaşık 5 saatlik uğraş ve araştırmalar sonucunda Mac Book Pro Snow Leopard 10.7.3 üzerinden SonicWall Client 5.5.707 sürümü ile şirketime bağlanmayı başardım. Sorunlar şöyle idi : 1. Bağlantı var ancak karşı sistemden internete çıkış yok. 2. Bağlantı var fakat hiç bir karşı kaynağa erişim yok. Çömzüm : 1. Sonicwall admin konsol üzerinde all tunnel özelliğini kaptıyorsunuz. 2. Yerel ağınız ile bağlanmak istediğiniz subnet'in ip adres aralıklarının farklı olmasına dikkat ediyorsunuz. Örnek olarak, evimde ve şirketimde 192 il başlaya adresler kullanıyorduk, evdekini 10.0 lı adrese çevirip bağlantıyı sağladım. Umarım faydalı olur...

12 Ekim 2008 Pazar

Extjs submit response dilemma : Aslında bunun türkçesi de fiyakalı olurdu :)

Önemli not : Eğer, bir forum submit ettikten sonra, success ve fail durumunu ayırd edip, ona göre fonksiyonlar çağırmak isterseniz,

örneğin :


handler:function(){
login.getForm().submit({
url: 'test.php',
form: 'login_form',
waitTitle:'Bağlanıyor',
waitMsg:'Veri gönderiliyor...',
success:function(form, action){alert('success');},
failure:function(form, action){alert('fail');},
});


test.php çıktısı aşağıdaki şekilde olmalı;

{"success":false,"errors":[],"errorMessage":"someCustomErrorMesage example"}

Aşağıdaki notta şöyle yazıyor : Eğer, error listesi olmazda error handling mekanızması çalışmıyor. Ve bu durumda, HTTP response 200 olan her durumda, success fonksiyonu çalışıyor, eğer sizi istediğiniz bu olmasa bile :(


Detaylı tartışma aşağıda :

http://extjs.com/forum/showthread.php?t=6236&page=2

Extjs : window close problemi

Extjs de window.close() yaparsanız, window referansı bellekte kalıyor. Onun yerine win.destroy() 'u kullandım. İşimi gördü.

Extjs : window close problemi

Extjs kullanırken, eğer bir pencereyi sadece win.close() ile kapatırsanız, DOM'dan kaldırmıyor. Bunu, yaşayarak gördüm. pencerenin köşesindeki çarpı tıklanınca pencere temizleniyor, ama win.close() yapınca hala bellekte referansı kalıyor. Bu sorunu gidermek için, win.destroy() denedim, çok faydasını gördüm, herkese tavsiye ederim.

Şimdiki sorunum, submit ettiği değer success dönmediği halde success olmuş gibi davranan formlar :)

11 Temmuz 2008 Cuma

CakePHP ve veritabanı utf-8 Encoding problemi...

Cake 1.2 beta ya kadar, encoding sorununu aşağıdaki şekilde çözmüştüm :

class AppModel extends Model{
function __construct() {
Configure::write('debug', 3);
$this->execute("SET NAMES UTF8");
parent::__construct();
}
}

Ancak 1.2 Beta'da sorun çıktı, ve artık database.php de değişiklik yapmak gerekiyor:

var $default = array('driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost', 'login' => 'login',
'password' => 'password',
'database' => 'database',
'prefix' => '',
'encoding' => 'utf8');

2 Temmuz 2008 Çarşamba

Java : HTML e-posta atarken, içine resim nasıl eklenir ?

Java : HTML e-posta atarken, içine resim nasıl eklenir ?

Java ile e-posta atmak çok basit bir işlem ancak, işin içine HTML ve resim olunca işler biraz değişiyor. Aşağıdaki örnekde nasıl olduğunu görebilirsiniz.

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

public class EmailSender {

String username = ""; // e-mail server username ile değişecek
String password = ""; // e-mail server password ile değişecek

private class SMTPAuthenticator extends javax.mail.Authenticator {

public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}

}

public static void main(String[] args) {

EmailSender emailSender = new EmailSender();

Properties props = System.getProperties();
SMTPAuthenticator authenticator = emailSender.new SMTPAuthenticator();

props.put("mail.smtp.host", "email server"); // E-posta sunucusunun
// adresi ile değişecek
props.put("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props, authenticator);

MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress("from")); // gönderen adresi
// ile
// değiştirilecek

message.addRecipient(Message.RecipientType.TO, new InternetAddress("TO")); // alıcı
// adresi
// ile
// değiştirilecek
message.setSubject("subject"); // Konu ile değiştirilecek

message.setSentDate(new Date());

message.setContent(emailSender.prepareHTMLMailWithImage());

Transport.send(message);

} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private Multipart prepareHTMLMailWithImage() throws MessagingException, URISyntaxException {

Multipart multipart = new MimeMultipart("alternative"); // Hazırladığımız HTML i kabul etmeyen client için ek olarak plaintext gönderiyoruz

MimeBodyPart mimeBodyPartPlain = new MimeBodyPart();

// Düz metin
String mailText = "Message text";

mimeBodyPartPlain.setDataHandler(new DataHandler(mailText, "text/plain; charset=UTF-8 "));
multipart.addBodyPart(mimeBodyPartPlain);
// Düz metin sonu

MimeBodyPart mimeBodyPartHtml = new MimeBodyPart();
String mailHtml = "HTML H1 HTML Message Text/H1 img src=cid:1@deneme align=\"right\" width=100 height=35/HTML";

mimeBodyPartHtml.setContent(mailHtml, "text/html; charset=UTF-8 ");

MimeBodyPart mimeBodyPartImage = new MimeBodyPart();
URL url = this.getClass().getResource("/img/your.jpg"); // com ile aynı düzeyde olacak bir dizin
try {
mimeBodyPartImage.setDataHandler(new DataHandler(new ByteArrayDataSource(url.openStream(), "image/jpg")));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

mimeBodyPartImage.setHeader("Content-ID", "<1@deneme>");

multipart.addBodyPart(mimeBodyPartHtml);
multipart.addBodyPart(mimeBodyPartImage);

return multipart;

}
}