software, software.java, software.sap

SAP GUI For Java Connection Strings

A question I get often is about the way I connect to SAP ECC from my Mac.

Obviously, many users prefer to install Windows to their Macbooks and run SAP GUI For Windows over it.

However; SAP has an alternative less known GUI for Linux / Mac systems: SAP GUI For Java. You can download it from http://service.sap.com for free using an S-user, install it to your Mac like a regular application and connect to any SAP ECC system. No need to install Windows at all.

The way you define a new SAP Connection in SAP GUI For Java differs slightly from SAP GUI For Windows. Let’s assume that you have the following connection information:

  • Address: 10.1.3.40
  • System No: 02

In SAP GUI For Java, you need to get to the “Advanced” tab, click “Expert mode” and enter the following connection string:

conn=/H/10.1.3.40/S/3202

Obviously, the address goes between /H/ and /S/ and the system number goes to the end of the string. If your system ID is 00, you need to enter 3200. If your system ID is 07, you need to enter 3207. In our case, your system ID is 02 so you need to enter 3202.

That’s all there is! Using this connection string, you should be good to go.

Your connection string can contain additional parameters; such as your user name, client number, etc. Here are some sample connection strings:

conn=/H/sapsrv/S/3204&jenc=MacTurkish&jloc=tr&cpg=1607&clnt=100&user=kerem

Here are some sample connection strings going over routers (IP’s changed for security reasons):

conn=/H/88.249.244.45/H/10.0.0.5/S/3200

conn=/H/78.186.178.12/W/golive2013/H/192.168.2.10/S/3200
The only disadvantage of SAP GUI For Java is for ABAP programmers: Smartform designer, Workflow tools and graphical screen designer tools are Windows-only and won’t run under SAP GUI For Java. Personally, I have a casual Windows installation with SAP GUI for Windows living under VMWare Fusion. Whenever I need to use one of those tools (maybe once a month); I run Windows inside the virtual machine without leaving Mac OS, get my job done, shut down Windows and continue working on the Mac with SAP GUI For Java.
Standard
software, software.apple, software.java, software.sap

Hacking SAP GUI for Java for MacBook Retina Compatibility

Good news: SAP GUI for Java 7.30 is out. Bad news: It looks bad on MacBooks with retina display. Here is a small hack to make it retina-compatible.

Make sure that SAP GUI is not running.

Browse “/Applications/SAP Clients/SAPGUI”. Right-click “SAPGUI 7.30.app” and select “Show Package Contents”. Open “Info.plist” with TextEdit and add the following lines to the very end of the file, before the last two lines:

<key>NSHighResolutionCapable</key>
<true/>
</dict>
</plist>

Save & exit.

Run “/Applications/Utilities/Terminal.app” and type the following command (modify if SAP GUI is installed elsewhere):

touch /Applications/SAP\ Clients/SAPGUI\ 7.30/SAPGUI\ 7.30.app 

That’s it! You may (or may not) need to restart your Mac; but next time you run SAP GUI for Java, it will look crystal clear – utilizing the potential of your retina display.

Standard
software, software.db, software.java

JSP – MySQL Türkçe Karakter Probleminin Çözümü

JSP ile MySql kullanıyor ve Türkçe karakter sorunu yaşıyorsanız; aşağıdaki adımlarla bu sorunu çözebilirsiniz.

Veritabanında Schema, Table ve Column bazındaki tüm Collation’larınız “utf8 – utf8_unicode_ci” olmalıdır.

JSP sayfalarınızın tamamında aşağıdaki Tag’lerden biri yer almalıdır:

<%@page pageEncoding="UTF-8"%>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

Veritabanı bağlantısını sağlayacağınız zaman, Connection String’inize aşağıdaki gibi karakter setini dahil edin:

jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8

Son olarak; özellikle Request / Response ile aldığınız Text’leri SQL sorgusuna dahil etmeden önce aşağıdaki kod ile dönüşümden geçirin (Gelen metin: Input, SQL’e gidecek metin: output):

byte[] bytes = new byte[Input.length()];
for (int i = 0; i < Input.length(); i++) bytes[i] = (byte) Input.charAt(i);
String output = new String(bytes, "UTF-8");
Standard
software, software.java

Blackberry Javascript Problem – And Solution

Recently, one of our clients had a Javascript related problem on their Blackberry 9000 devices. An Intranet page, which used to work properly in former Blackberry models, stopped working on their new Blackberries.

 
 

The same page works well on Internet Explorer, but doesn’t work on Mozilla Firefox either.

 
 

Upon closer inspection, I have found out that this is a Javascript related problem. Here is the code snippet from the problematic page:

 
 

(…….)

url += document.getElementById(‘ans’).value;

(…….)

<select name=ans>

<option>…</option>

</select>

 
 

The error occured on the getElementById command. The reason is; Blackberry 9000 (and Mozilla) makes it mandantory to have the document elements the “id” property defined. Here is the corrected code snippet:

 
 

(…….)

url += document.getElementById(‘ans’).value;

(…….)

<select id=ans name=ans>

<option>…</option>

</select>

 
 

 
 

And that works like a charm.

 
 

Blackberry probably changed it’s Javascript engine on their new models and turned to Mozilla. You may think that it’s a problem with Mozilla & Blackberry, but actually it’s a “problem” with Microsoft. According to the HTML DOM, the first code snippet isn’t supposed to work at all – because HTML elements must have their “id” property defined so that getElementById works. Check http://www.w3schools.com/HTMLDOM/met_doc_getelementbyid.asp for reference.

 
 

This means; Microsoft’s Javascript engine tolerates the missing “id” property and has the ability to use the “name” property instead. Mozilla and Blackberry is working as intended and as defined in DOM. However, because of Microsoft’s extra tolerance; websites tested on Microsoft Internet Explorer only make Mozilla (and probably other browsers) look buggy.

Standard
software, software.java, software.net

Teknoloji Seçimi – Java vs .NET


Bir tanıdıktan daha duymuştum ama emin değildim yine de. “Türkiye’de java ile iş yapan çok fazla kurum olmadığından aranan kişiler genelde akademik eğitimi olan kişiler, bu yüzden .net öğren” demişti. Ne kadar doğru bilemem ama her ikisininde birbirine olan benzerliğini düşünürsem ( kitabınızda ki örneklerde fark ettim aslında bu benzerliği ) dediğinizi gibi ikisine de aşikar olabilirim.

Peki son bir rica, bende araştıracağım ama sizin tavsiye edebileceğiniz .net kitabı var mı? Yani giriş seviyesi için şu iyi olur diyebileceğiniz…

Türkiye’de Java ile iş yapan kurum olmadığı görüşüne pek katılmıyorum. Microsoft haricindeki birçok büyük firma (örnek: SAP, Oracle, IBM) ürünlerinin çok önemli bir kısmında Java altyapısı kullanmakta veya doğrudan Java desteği vermektedir. Daha net bir örnek vereyim: SAP’nin Netweaver çatısı altındaki ürün yelpazesinin tamamı Java tabanlıdır. Aynı şekilde Oracle veya IBM ürünleri üzerinde geliştirme yapmak istediğinde bulacağın API’ler yine muhtemelen Java tabanlı olacaktır. Bankacılık, finans, telekom gibi sektörlerde de Java kullanımı oldukça yaygındır.

Ne var ki; .NET daha popüler, Java daha başarılı, .NET daha hızlı, Java ile falanca projeyi yapmışlar gibi söylemlere dayanarak teknoloji seçimi yapmayı doğru bulmuyorum. Geçmiş bir yıla baktığımda, kendi yaptığımız projelerde .NET kullandığımız da oldu Java da. Kullanım oranımız ise neredeyse aynı diyebilirim. Burada önemli olan şey; bir teknolojiyi seçip fanatik bir şekilde ona odaklanmak yerine farklı teknolojilerin artısı ve eksisi olduğunu kabul edip doğru yerde doğru teknolojiyi kullanabilmektir. Bıçak ile çorba içemeyeceğin gibi, kaşık ile de elma soyamazsın 😉

Buna karşılık; Türkiye’de istihdam anlamında .NET ile Java programcısı arayışındaki iş ilanı sayılarını karşılaştıran bir araştırma yapılmış ise, bundan haberdar değilim. Böyle bir araştırma ilginç olabilirdi.

Programcılığı ciddi bir kariyer konusu olarak düşünüyorsan, ikisine birden aşina olmanda fayda var diye düşünüyorum. Muhtemelen birinde uzman seviyesinde, diğerinde ise orta seviyede olmayı hedeflemelisin. Zaman geçtikçe özel çalışmalarınla ikincisinde de uzman seviyesine gelebilirsin.

Burada dikkat etmen gereken konu şu: Karşına OOP Design, Threading, Event gibi kavramlar çıktıkça bunların .NET veya Java’da Syntax anlamında nasıl yapıldığını ezberlemek yerine kavramsal olarak anlamaya çalış. Nerede, niçin kullanılır, ne işe yarar, arkasındaki mekanizma nedir, bunları anlamaya çalış. Mantık olarak anladığında; .NET veya Java (veya Phyton, her neyse) kullanıyor olman sadece Syntax farkı yaratan basit bir detay olacaktır.

Kitap konusuna gelince… .NET konusunda piyasada pek çok kitap var ama benim şahsen alıp okuduğum bir kitap olmadı, o yüzden özel bir tavsiyem yok. Ama forumlarda yapılan yorumlara bakarak çok tavsiye edilen kitaplardan birini seçebilirsin diye düşünüyorum. Java konusunda ise Deitel’in yayınlamış olduğu Java kitabını şahsen kullanmış olduğum için tavsiye edebilirim. Kitap İngilizce’dir, ve ben Yeditepe Üniversitesi’nin kitapçısından almıştım.

İyi çalışmalar…

Standard
software, software.java

Java Parantez Stilleri

Sizin kitabınızı aldım. ilk günde 50. sayfaya yada bir başka değişle DEĞİŞKENLERE geldim. buraya kadar çok açık anlatmışsınz. ilk önce size amacımı söyleyeyim. ben bir satışcıyım. Piyasada baktım CRM programları çok pahalı bende bunu kendim yapacam diyerek başladım. Kitabınızın okuduğum kadarıyla JAVA kullanmaya karar verdim. Sizin tavsiyeniz nedir?

şimdi geçelim diğer sorulara.

anladığım kadarıyla program yazmaya değişkenleri tanıtarak ve alacağı değeri tanıtarak başlıyoruz.

boolean bWindowsExists; yadıktan sonra entera basıp mı aşağıdakini yazıyoruz.

if (bWindowsExits) dan sonra aşağı satıra geçmelimiyiz? yoksa devam etmeli miyiz? yani

if (bWindowsExits){sistem.out.printin (“ş uanda değer 1;”);} gibi devam mı etmeli.

Merhaba…

Halihazırda piyasadaki en yaygın geliştirme platformları Microsoft .NET ve Java’dır. İkisi arasındaki karşılaştırmayı kitap içerisinde zaten yapmıştım. İstediğini seçebilirsin.

if komutundan sonra Enter’a basıp basmayacağın senin stiline bağlı. Ben genelde şöyle yazmayı tercih ediyorum, ama çok farklı yaklaşımlar da gördüm:

if (…)
{


}

Ancak; şöyle bir ipucu verebilirim: Eğer if’ten sonra tek bir koşul yazacaksan, Enter’a basmana da gerek yok parantez açmana da. Mesela şu komut Java’da geçerlidir:

if (bWindowExists) System.out.println(“Şu anda değer 1”);

Ama şöyle yazarsan işler değişir:

if (bWindowExists) System.out.println(“Şu anda değer 1”);
System.out.println(“Tamam mı?”);

Bu durumda, “Tamam mı” yazısı bWindowExists’te hangi değer olursa olsun ekranda görüntülenecektir. Koşula bağlı birden fazla komut, mutlaka küme paranteziyle çevrelenmelidir:

if (bWindowExists)
{
System.out.println(“Şu anda değer 1”);
System.out.println(“Tamam mı?”);
}

İyi çalışmalar…

Standard
software, software.java

Java ile Seri Port Okumak

Java’da seri port okumak son derece kolay bir iş, korkacak birşey yok…

Bu iş için, öncelikle RXTX sitesinden RXTX 2.1’i indirin. 2.0 sürümü Sun’ın (Windows desteği olmayan) CommAPI’sine ihtiyaç duyar, bu yüzden Windows ortamında 2.1’i tercih etmeniz önemli.

İndireceğiniz ZIP dosyasındaki rxtxParallel.dll ve rxtxSerial.dll dosyalarını, c:\windows\system32 dizinine (veya buna karşılık gelen dizine) kopyalayın. Bu işlemi, programın Deploy edileceği makina üzerinde de yapmanız gerekeceğini unutmayın.

Artık çalışmaya başlayabilirsiniz. Yeni bir Java projesi yaratın, ve yine ZIP dosyasında bulacağınız RXTXcomm.jar kütüphanesini projenize dahil edin.

Projenizde, TwoWaySerialComm adlı bir sınıf yaratın. Bu sınıf, seri porttaki hareketleri izleyeceğiniz sınıf olacaktır. Kodları ise, kabaca aşağıdaki gibi olmalıdır:

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TwoWaySerialComm
{
public static String lastData;

public TwoWaySerialComm()
{
super();
lastData = “”;
}

void connect ( String portName ) throws Exception
{
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if ( portIdentifier.isCurrentlyOwned() )
{
System.out.println(“Error: Port is currently in use”);
}
else
{
CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

if ( commPort instanceof SerialPort )
{
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();

(new Thread(new SerialReader(in))).start();
(new Thread(new SerialWriter(out))).start();

}
else
{
System.out.println(“Error: Only serial ports are handled by this example.”);
}
}
}

/** */
public static class SerialReader implements Runnable
{
InputStream in;

public SerialReader ( InputStream in )
{
this.in = in;
}

public void run ()
{
byte[] buffer = new byte[1024];
int len = -1;
try
{
while ( ( len = this.in.read(buffer)) > -1 )
{
lastData = new String(buffer, 0, len);
System.out.print(new String(buffer,0,len));
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}

/** */
public static class SerialWriter implements Runnable
{
OutputStream out;

public SerialWriter ( OutputStream out )
{
this.out = out;
}

public void run ()
{
try
{
int c = 0;
while ( ( c = System.in.read()) > -1 )
{
this.out.write(c);
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
}

serialPort.setSerialPortParams komutunu, seri porta bağladığınız cihazın özelliklerine göre modifiye etmeniz gerekebilir. Bu sınıf; başlayacak ek bir Thread içerisinde, COM portundan gelen bütün verileri hem ekrana yazacak (System.out.print(new String(buffer,0,len));), hem de “lastData” adlı değişkene atayacaktır (lastData = new String(buffer, 0, len);). Gerçek bir uygulamada ekrana yazdırma kısmını silip, lastData içerisindeki veriye erişmek iyi bir fikir olacaktır. İhtiyaca bağlı olmakla birlikte, Event tabanlı bir yapı kurmak daha da iyi bir fikir olabilir.

Main sınıfınızda yapmanız gereken şey ise şudur:

public static void main(String[] args) {
System.out.println(“Program basladi…”);
try
{
TwoWaySerialComm a = new TwoWaySerialComm();
a.connect(“COM1”);
}
catch ( Exception e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}

Buradaki COM1 değerini, bilgisayarınızdaki doğru portun adı ile değiştirmelisiniz.

İşte bu kadar basit!

Standard