Compile android native library with freepascal

Artikel ini menggambarkan bagaimana cara membuat share object *so file sebagai native library untuk android dengan menggunakan freepascal.
saya menggunakan ubuntu 11.04 x86_64 sebagai development machine, freepascal dan lazarus saya gunakan codetyphon versi 1.6 download disini. penggunaan Codetyphon atau freepascal dari svn bukan masalah.
berikut urutannya :
* Download codetyphon ;)).
* Install codetyphon anda sampai berhasil.
* Download script by me, beserta patch di kotak download
crossbuild4android.tar.gz
* extract the file
* masuk ke folder “crossbuild4android”
* ketik ./setup.sh
* Jika tidak ada aral melintang, insyaAlloh success. amien

ini mungkin artikel PART 1. ingin lanjutannya? silakan kasih comment.

thank you

thanks

OAuth dengan delphi/ freepascal

Kalo belom tahu OAuth, baca di wiki saja. Twitter dan facebook menggunakan OAuth untuk berbagi private resource. mereka juga menyediakan SDK dengan banyak bahasa, tapi … tidak ada untuk bahasa pascal. kenapa ya?.
akses ke API mereka mudah saja bagi delphi/ freepascal, karena twitter dan facebook menggunakan format yang sudah umum dipake banyak bahasa pemrograman yaitu XML dan JSON. dan itu mudah saja.. he.he…
tapi bagaimana dengan OAuth nya?
saya menemukan OAuthdelphi di sf, Oauth.pas ini menggunakan Indy, mengingat library indy sudah lama, dan jarang yg memaintain lagi. maka saya putuskan menggantinya dengan synapse.
maka jadilah 3 file : twitterclient.pas, facebookclient.pas dan OAuth.pas *edited

apa perlu saya share dengan anda ? hmmm … mungkin nanti atau sebentar lagi.

thanks.

Ms Project OLE Automation

Melihat documentasi microsoft tentang Microsoft Office Project … brrr…. buanyakkk !!. sebagai bentuk catatan bagi saya dan mungkin bantuan bagi pembaca maka saya sharing dikit mengenai Object-object yang ada di microsoft Office Project. ini unit interfacenya, yang dipake aja


unit MSProject_Intf;

interface

uses
ActiveX;

Const
Class_ProjectApplication: TGUID = '{36D27C48-A1E8-11D3-BA55-00C04F72F325}';
Class_Projects: TGUID = '{1019A320-508A-11CF-A49D-00AA00574C74}';

type
PjPoolOpen = TOleEnum;
const
pjPromptPool = $00000000;
pjPoolReadOnly = $00000001;
pjPoolReadWrite = $00000002;
pjPoolAndSharers = $00000003;
pjDoNotOpenPool = $00000004;

type
PjMergeType = TOleEnum;
const
pjDoNotMerge = $00000000;
pjMerge = $00000001;
pjPrompt = $00000002;
pjAppend = $00000003;

type
PjSaveType = TOleEnum;
const
pjDoNotSave = $00000000;
pjSave = $00000001;
pjPromptSave = $00000002;

type
PjResourceTypes = TOleEnum;
const
pjResourceTypeWork = $00000000;
pjResourceTypeMaterial = $00000001;
pjResourceTypeCost = $00000002;

type
MSProjectApplication = dispinterface;
Project = dispinterface;
Tasks = dispinterface;

ProjectApplication = MSProjectApplication;

Assignment = dispinterface
['{000C0C45-0000-0000-C000-000000000046}']
property TaskID: Integer dispid 255852547;
property ResourceID: Integer dispid 255852548;
property TaskName: WideString dispid 255852549;
property ResourceName: WideString dispid 255852550;
property Units: OleVariant dispid 255852551;
property Work: OleVariant dispid 255852552;
property Start: OleVariant dispid 255852564;
property Finish: OleVariant dispid 255852565;
property ActualStart: OleVariant dispid 255852566;
property ActualFinish: OleVariant dispid 255852567;
property Delay: OleVariant dispid 255852569;
property Cost: OleVariant dispid 255852570;
property OvertimeCost: OleVariant readonly dispid 255852571;
property ActualCost: OleVariant dispid 255852572;
property RemainingCost: OleVariant readonly dispid 255852573;
property ActualOvertimeCost: OleVariant readonly dispid 255852574;
property RemainingOvertimeCost: OleVariant readonly dispid 255852575;
procedure Delete; dispid 255852680;
property ResourceType: PjResourceTypes readonly dispid 255852820;
property BudgetWork: OleVariant dispid 255853213;
property BudgetCost: OleVariant dispid 255853214;
end;

Assignments = dispinterface
['{000C0C46-0000-0000-C000-000000000046}']
property Application: ProjectApplication readonly dispid 65524;
property Parent: Project readonly dispid 65523;
property Count: Integer readonly dispid 65525;
property UniqueID[Index: Integer]: Assignment readonly dispid 65521;
function Add(TaskID: OleVariant; ResourceID: OleVariant; Units: OleVariant): Assignment; dispid 65526;
property Item[Index: OleVariant]: Assignment readonly dispid 0; default;
property _NewEnum: IUnknown readonly dispid -4;
end;

Resource = dispinterface
['{F59E841B-1518-4466-85EB-CCE914D59AF6}']
property ID: Integer readonly dispid 205520896;
property Name: WideString dispid 205520897;
property Cost: OleVariant readonly dispid 205520908;
property Work: OleVariant readonly dispid 205520909;
property Assignments: Assignments readonly dispid 205520951;
property Index: Integer readonly dispid 205521149;
property type_: PjResourceTypes dispid 205521196;
property CostPerUse: OleVariant dispid 205520914;
end;

Resources = dispinterface
['{000C0C42-0000-0000-C000-000000000046}']
property Application: ProjectApplication readonly dispid 65524;
property Parent: Project readonly dispid 65523;
property Count: Integer readonly dispid 65525;
property UniqueID[Index: Integer]: Resource readonly dispid 65521;
function Add(Name: OleVariant; Before: OleVariant): Resource; dispid 65526;
property Item[Index: OleVariant]: Resource readonly dispid 0; default;
property _NewEnum: IUnknown readonly dispid -4;
end;

Task = dispinterface
['{4A4829B2-31DA-4F61-AF00-8F5CE32B9442}']
property Cost: OleVariant dispid 188743685;
property ID: Integer readonly dispid 188743703;
property Resources: Resources readonly dispid 188743919;
property Assignments: Assignments readonly dispid 188743886;
property Index: Integer readonly dispid 188744040;
property OutlineLevel: Smallint dispid 188743765;
property ActualStart: OleVariant dispid 188743721;
property ActualFinish: OleVariant dispid 188743722;
property Name: WideString dispid 188743694;
property OutlineChildren: Tasks readonly dispid 188743817;
end;

Tasks = dispinterface
['{000C0C40-0000-0000-C000-000000000046}']
property Application: ProjectApplication readonly dispid 65524;
property Parent: Project readonly dispid 65523;
property Count: Integer readonly dispid 65525;
property UniqueID[Index: Integer]: Task readonly dispid 65521;
function Add(Name: OleVariant; Before: OleVariant): Task; dispid 65526;
property Item[Index: OleVariant]: Task readonly dispid 0; default;
property _NewEnum: IUnknown readonly dispid -4;
end;

Project = dispinterface
['{B948BE90-9E17-42B1-88D4-03E6B7B27B8A}']
procedure Activate; dispid 13;
property ID: Integer readonly dispid 47;
property Resources: Resources readonly dispid 2;
property Tasks: Tasks readonly dispid 1;
property Index: OleVariant readonly dispid 65527;
property Parent: IDispatch readonly dispid 65523;
property Application: ProjectApplication readonly dispid 65524;
property Work: OleVariant readonly dispid 100;
property ActualStart: OleVariant readonly dispid 141;
property ActualFinish: OleVariant readonly dispid 142;
property Name: WideString dispid 0;
end;

Projects = dispinterface
['{574E0861-265A-4E1A-AB8C-9A2864D5F6F4}']
property Application: ProjectApplication readonly dispid 65524;
property Parent: IDispatch readonly dispid 65523;
property Count: Integer readonly dispid 65525;
function Add(DisplayProjectInfo: OleVariant; Template: OleVariant; FileNewDialog: OleVariant): Project; dispid 65526;
property Item[Index: OleVariant]: Project readonly dispid 0; default;
property _NewEnum: IUnknown readonly dispid -4;
function CanCheckOut(FileName: OleVariant): WordBool; dispid 1;
function CheckOut(FileName: OleVariant): WordBool; dispid 2;
end;

MSProjectApplication = dispinterface
['{00020AFF-0000-0000-C000-000000000046}']
function FileOpen(Name: OleVariant; ReadOnly: OleVariant; Merge: OleVariant;
TaskInformation: OleVariant; Table: OleVariant; Sheet: OleVariant;
NoAuto: OleVariant; UserID: OleVariant; DatabasePassWord: OleVariant;
FormatID: OleVariant; Map: OleVariant; openPool: PjPoolOpen;
Password: OleVariant; WriteResPassword: OleVariant;
IgnoreReadOnlyRecommended: OleVariant; XMLName: OleVariant): WordBool; dispid 102;
function OpenXML(const XML: WideString): SYSINT; dispid 5079;
function AppMaximize: WordBool; dispid 2008;
function AppMinimize: WordBool; dispid 2009;
function FileClose(Save: PjSaveType; NoAuto: OleVariant): WordBool; dispid 103;
function DocClose: WordBool; dispid 2007;
property Projects: Projects dispid 5000;
end;

implementation

end.

Kylix webservice using fastCGI

Aplikasi web yang di bangun dengan Kylix menggunakan CGI, bagaimana jika kita ingin menggunakan FastCGI ?

Begini caranya :

1. Download FastCGI header file for pascal  … linknya kemana yah kemaren ??

2. nah ini … blom dicobain!!. ntar yah ?

3. kalo ada yg udah bisa mohon share deh..

4. Kalo saya dah bisa tak terusin ini artikel

Ok. thanks

SMS Server for linux environment

Lupa nulis blog, jadi ini aja di tulis… he..he.. , bisa sebagai catatan!

untuk project ini masih berjalan. blom selesai, jadi saya tulis minimal requirmentnya aja dulu.

  • Saya gunakan lazarus sebagai IDE development
  • Namanya server jadi pasti harus mandiri. karena di linux mestinya aplikasi ini ada sebuah Daemon
  • SMS Server ini harus juga bisa di connect oleh client, sebagai user interface (Client bisa Webbase, desktop linux, windows, maupun MAC – itu pula kenapa saya pilih lazarus!! =P )
  • harus di develop dulu sebuah component lazarus yang reusable. mungkin suatu saat di jadikan OpenSource ?.
  • Kemampuan server SMS ini minimal harus bisa;
  1. SendSMS,
  2. ReceiveSMS,
  3. SendUSSD,
  4. SIMToolkit,
  5. KeyPadControl
  6. Connect to DB
  • Trus apalagi ? eh..gitu dulu deh.!

install lazarus 0.9.26 on Ubuntu 8

Gini nih kalo lagi deadline !. nulis blog aja jarang kosakata, maunya code melulu. he.he..he…

langsung aja yah .. Ubuntu 8, versi lazarus defaultnya adalah lazarus 0.9.24, jadi kalo mo install versi 0.9.26 kita harus tahu dependencies paketnya dulu, atau paket yang harus ada ketika kalo lazarus mo diinstall. caranya bisa gini nih:

1. ketik apt-get update (ini untuk update repository info)  tentu saja setelah kita ketik sudo su

apt-get-sudo1

apt-get-update

2. ketik apt-get install lazarus, sehingga tamplil seperti gambar berikut. ingat ! jangan di tekan “Yes” karena itu berarti melakukan instalasi lazarus 0.9.24 juga, sedangkan kita hanya butuh informasi paket yang di perlukan saja.

apt-get-install-lazarus

nah… tuh kelihatan kan paket apa yang belom ada untuk install lazarus ?.

3. Ketik apt-get install … … seperti terlihat di gambar berikut. list ini didapatkan dari informasi pada point no 2. bisa di ketik satu-satu atau di copy aja. tapi hati2 karena character di atas mengandung #13 yang berarti enter atau execusi perintah.

apt-get-install-dependc

4. Download lazarus 0.9.26 dari sini kita gunakan paket nya debian. download semua aja yah ?.

5. Install semua paket yang telah didownload. paket-paket tersebut punya depencencies juga antara mereka jadi sebaiknya satukan aja perintahnya menjadi

> gdebi nama-paket1 nama-paket2 … … , dst.

6. dah .. selesai. shortcut ada di menu application > programming > lazarus.  ….. ga tampil ?

bagaimana buat webservice pake lazarus ?. okey . kita tunggu posting saya berikutnya. sekarang waktunya ngerjain next project …. (rahasia!!!).

eh iya ini screenshotnya lazarus.
laz-screenshoot

Banyak komponen punya TurboPower masuk sana. Indy ada juga . tapi ga default.

TNewMessageReceived, sebuah event TSmsGateway

Bagaimana mendeteksi sms masuk secara otomatis, seperti handphone kita ?. Enggak usah banyak kata deh, mari kita ikuti langkah berikut.
buat sebuah event !, Kita kasih nama TNewMessageReceived yang menjadi.


TNewMessageReceived = Procedure (Sender: TObject; From, Content: String) of Object;

pada kelas TSmsGateway kita buat variable menjadi

FOnNewMessageReceived: TNewMessageReceived;

dan tentu saja pada section published kita deklasikan property seperti

property OnNewMessageReceived: TNewMessageReceived read FOnNewMessageReceived write FOnNewMessageReceived;

Kemudian kita buat event trigerring menggunakan TThread, kenapa pake thread ? .. coba deh buat pake timer !. lihatlah bedanya?


TSmsThread = class(TThread) // background monitoring event
private
FSmsGateway: TSmsgateaway; // ini udah ada di artikel saya sebelumnya
protected
procedure execute; override;
public
constructor Create(aSmsGateway: TSmsgateaway);
end;

pada procedure execute kita isi seperti ini :

procedure TSmsThread.execute;
const
secs = 3;
var
I: Integer;
begin
inherited;
I := 0;
while not Terminated do
begin
Inc(I);
if I >= Secs then
begin
I := 0;
FSmsGateway.DetectNewMessage(FSmsGateway);
end;
Sleep(1000); // 1 detik, secs = 3. jadi cek modem setiap 3 x 1 = 3 detik
end;
end;

Kemudian kita lihat procedure DetectNewMessage, yang bisa berisi input AT Command seperti TE+CNMI akan tetapi karena banyak perbedaan penggunaan perintah ini, di masing-masing modem maka saya lebih suka pake AT+CMGL=0 atau AT+CMGL=”REC UNREAD” tergantung dari AT+CMGF nya. sehingga isi dari procedure DetectNewMessage adalah

procedure TSmsgateaway.DetectNewMessage(Sender: TObject);
var
sres : String;
Strings: TStrings;
msTemp: TMessageSpec;
begin
if SerrialUsed = False then // antisipasi penggunaan modem bersamaan !!
begin
msTemp := FMessageSpecs;
FMessageSpecs := msRECUNREAD; // set property untuk sms blom terbaca
try
RetrieveSMS; // perintah at+cmgl ada disini yg langsung tersimpan di TCollectionItem
if Assigned(FOnNewMessageReceived) then // jika terjadi event maka otomatis masuk
FOnNewMessage(Self,FSmsList.Item[0].sender,FSmsList.Item[0].body); // kesini
except on ex:ESynaSerError do
FMessageSpecs := msTemp;
end;
FMessageSpecs := msTemp;
end;
SerrialUsed := False;
end;

nah … sudah selesai, silakan coba!!,

Membuat aplikasi kirim sms lewat web

Pernah baca postingan saya soal sms gateway blom jadi ?. nah … anda salah !! bukan itu yang akan saya publish disini untuk buat aplikasi kirim sms lewat web!. hi..hi… !!, tapi kita akan gunakan sms library .net gratisan. kenapa gak pake punya sendiri ? karena komponenku blom sempurna, malu nih mau di taruh disini walaupun sudah mulai saya porting ke .net.

yang akan saya jabarkan disini adalah sedikit pengetahuan (Sedikiiiiit sekali) tentang pembuatan webservice menggunakan asp.net dengan codebehind delphi, tentu saja!, untuk aksesnya atau client web bisa menggunakan apa saja baik itu asp .net sendiri maupun php, asp, coldfusion, java, dll atau intraweb delphi (namanya juga XML khan bisa dimakan oleh siapa saja toh ?? tapi pokoknya web, karena judulnya ketahuan khan?). nah ikutan langkahnya sebagai berikut :

1. Delphi berapa yg anda punya nih ? (yg penting ada asp.net bisa 8, turbo 2006 for .net, ato 2007 lebih bagus tapi mahal he..h.ehh) mbah emarcadero di murahin donk !! khan saya cucu!!

2. Download atsms library nya di sini

3. Install komponen atsms dengan cara klik menu component -> installed .net component … wait for a second yah ??

4. Nah muncul tuh ! component .net yg di load oleh IDE, sekarang pada category tulis terserah maumu ! misalnya “ATSMS” kemudian klik tombol select an assembly … cari file atsms.dll yang tadi kamu download trus open. maka terlihat di list adalah serialdriver dengan category (ATSMS) yg anda tulis tadi !

5. Sekarang mulai pembuatan webservice application! pada menu delphi .net klik menu file -> new -> other pilih delphi for .net project dan pilih ASP.Net Web Service application maka muncul dialog untuk nama aplikasi beserta folder yang otomatis berapa di baway wwwroot milik IIS. silakana kasih nama misal sms_ws

6. Terlihat sekarang tampilan file webservice1.asmx. cari komponen serialdriver yg berada pada tab ATSMS, double klik aja tuh!

7. Sekarang tekan F12, maka hal yang familiar bagi programmer delphi terlihat ya toh ?? pada section public secara default delphi membuat function helloword seperti ini

[WebMethod]
function HelloWorld: string;

dengan isi seperti ini

// Sample Web Service Method
// The following method is provided to allow for testing a new web service.
function TWebService1.HelloWorld: string;
begin
Result := 'Hello World';
end;

8. contoh helloword biarin aja dulu.. kita tambahin aja [WebMethod] menjadi [WebMethod(description=’Function yang Menghasilkan output “Hello Word”‘)]

9. Sekarang ketik function sebagai berikut

[WebMethod(Description='function kirim SMS, string result adalah message yg terjadi')]
function SendSMS(Nomor,Pesan:String): String; // lalu tekan ctrl+shift+c

10. lalu ketik isi function menjadi seperti ini

function TWebService1.SendSMS(Nomor, Pesan: String): String;
var
ModemGSM: GSMModem;

MsgNo: String;

begin
Result := '';
ModemGSM := GSMModem.Create;
ModemGSM.Port := 'COM12'; // gunakan sesuai dengan port modem nya
ModemGSM.BaudRate := 115200; // sesuaikan dengan baudrate modem kalian
ModemGSM.DataBits := 8;
ModemGSM.Parity := EnumParity.None; // tambahkan di uses ATSMS.Common
ModemGSM.StopBits := EnumStopBits.One;
ModemGSM.FlowControl := EnumFlowControl.RTS_CTS;
try
ModemGSM.Connect;
if ModemGSM.IsConnected then
begin
MsgNo := ModemGSM.SendSMS(Nomor,Pesan);
Result := 'Message have been sent. Response: '+MsgNo;
end;
except on Ex:Exception do
Result := 'Error sending message : '+Ex.Message;
end;

ModemGSM.disconnect;

ModemGSM.free;
end;

11. nah sekarang silakan di tekan F9, hasilnya terlihat dua function yang kita buat tadi beserta comment, dan bisa langsung anda coba tanpa kita membuat aplikasi di sisi web service client !!,

12. Selamat mencoba !! eh … blom mau tahu cara akses dari client ? ntar tunggu ya ? buka puasa dulu emhmmm…aemm

Raw printing pake web (ActiveX)

Kekuatan aplikasi webbase memang tidak bisa diragukan dalam hal deployment. akan tetapi kekurangan lain masih banyak juga terutama dalam hal interaksi dengan user, ketika memakai aplikasi desktop kita tidak perlu menunggu hasil dari event onclick pada suatu combobox dengan menunggu seluruh halaman untuk proses load dan langsung melakukan aktifitas lainnya. sayangnya ini tidak terjadi pada aplikasi webbase !!.

Tapi dengan adanya AJAX (Asynchronous Javascript And XML), yaitu suatu technic pencampuran pemrograman, masalah diatas bisa di atasi! ..

nah sekarang bagaimana mengatasi masalah raw printing pada aplikasi webbase ??.

kalo kita pernah buat aplikasi untuk sistem inventory (Kasir) webbase saya kira pertanyaan diatas pernah juga timbul srimulat …. eh salah… muncul !!! hi..hi..

.. salah satu jawabannya mungkin adalah activex !! walaupun ini bukan jawaban mutlak tapi setidaknya bisa melengkapi.. ya kan ? iya dong ! he.he.. cuma ini juga menimbulkan masalah baru. apa itu ? activex hanya bisa di jalankan di browser IE (internet explorer punyae mikocok !). jadi … yah ga papa lah kan setidaknya melengkapi ya..tho ???

berikut adalah cara-cara saya membuat activex nya … ya !! anda benar. tentu saya pake delphi !! (isone iku thok!! he..he.. )

1. Berhubung udah hampir jam 3 dinihari !! … maka tulisan ini berlanjut aja yah .. saya mo tidur dulu . ngantuk nih!!