PHP projects sourcecode giveaway (NetFolder, ARMS)

I’ll be giving out sourcecode of my PHP projects for free with hope that I will gain some input from you all.

There are around 10 php projects which will be shared. Okay, the first project will be NetFolder, which is an online efiling system.

NetFolder (online f-filing)
Demo : http://efiling.reeq.my
Username : testing
Password : testing23

I have made two customized version based on this project which is currently being used by my customers.

If you are interested with the project, inform me and I’ll give you the latest updated source code, because I might update the code now and then.

The coding is fairly simple, if you ever read on my previous post regarding oneFace. :) The database itself is only consist of 31 tables. The brand “NetFolder” is reserved, thus you are encouraged to put your own branding if you plan to derive another fork of it.

*Update as of 25th March 2012

Download link :  http://goo.gl/JWcID
Database : /efilingv4/efiling.sql

*Update as of 27th March 2012

ARMS (fixed asset record management system)
Demo : http://reeq.my/arms/
Username : testing
Password : <no password>

There is also customized version of the system which concentrate more on the asset movement and telecommunication equipment record.

If you are interested with the project, inform me and I’ll give you the latest updated source code, because I might update the code now and then.

Download link :  http://goo.gl/AENE8
Database : /arms/arms.sql

NetFolder : Cloud eFiling Solution (Source to be shared!)

Hi! and good day everyone (reminisce of IU’s 3-hi-pitch ^^;)

One after another, we have more to offer to enthusiast out there. We’ll disclose the source code of our alternative version of cloud efiling, Netfolder!

It’s been around 3 months since the dump directory being allocated by ReeqSolution at http://efiling.reeq.my. Started as a place to submit feature suggestion of our efiling leading solution (INDEX), netfolder has grown into a webbased efiling solution (of course without cached and desktop integration).

This slideshow requires JavaScript.

I’d like to disclose the source for those who interested to improve it. Please leave your email and state the purpose for you to acquire the source and I will email the source to you. ^^;

ReeqLicator v1.4

If you’re using fingertec biometric device, you might stumbled upon on how to store the transaction table to your MySQL table. To use FRIS, you’ll have to purchase another license, and you are left with the option to use FTDP (Fingertec Data Processor) which is free and easy to setup.

Reeqlicator work as the bridge between your MySQL database and FTDP. Feel free to use and submit your improvement. :)

This slideshow requires JavaScript.

Download ReeqLicator here :  http://www.mediafire.com/?1mz794406z1w445

Sources is provided in the form of Netbean7.0 project folder.

Fingertec Project Status #1

Yup, the project was done. Anyway, I’ll wait for the complete sdk from fingetec and recode them all over again. Instead of relying too much on ftdp which made the performance came up poor, I’ll try the low level sdk. At least i’ll save up half of the cpu consumption by running only my code of data retrieval routine from the terminal. Additionally i could save up the io cost by reducing the db roundtrip by using only single db, eliminating the usage of ms access by ftdp.. :)

ACM(access contol matrix) in oneface

In the nutshell, here’s how simple acm in miniOneFace:

session_start();
include 'prepend.php';
include DBCONFIG;
if(isset($_SESSION['role'])){
$db_connection = new mysqli($DB_OBJ['DB_HOST'],$DB_OBJ['DB_USER'],$DB_OBJ['DB_PASS'],$DB_OBJ['DB_NAME']);
$rs = $db_connection->query("select * from acm_realm where role_id = '".$_SESSION['role']."' AND INSTR('".$_SERVER['PHP_SELF']."',key_pattern)>0");
$d = $rs->fetch_array(MYSQLI_ASSOC);
if($d['id']!=''){
}else{
go(NOT_AUTHORIZED);
exit();
}
mysqli_free_result($rs);
mysqli_close($db_connection);
}else{
go(NOT_LOGIN);
exit();
}

And here’s the of-action (using classic wrapper):


include "_set.php";
include PERSIST;
include DBCONFIG;

$p = new Persist($DB_OBJ);
$p->setTable("acm_realm");

if (e('act')==md5('add_top')){
$p->set("code",e("code"),"s");
$p->set("parent_id",-1,"i");
$p->insert();
go("acm_edit.php?role_id=1&t=".$p->getAutoId());
}
if (e('act')==md5('add_child')){
$p->set("code",e("code"),"s");
$p->set("key_pattern",e("key_pattern"),"s");
$p->set("parent_id",e("parent_id"),"i");
$p->set("role_id",e("role_id"),"i");
$p->insert();
go("acm_edit.php?role_id=".e("role_id")."&t=".e('t'));
}
if (e('act')==md5('update_child')){
$p->set("code",e("code"),"s");
$p->set("key_pattern",e("key_pattern"),"s");
$p->set("role_id",e("role_id"),"i");
$p->setCriteria("id=".e("id"));
$p->update();
go("acm_edit.php?role_id=".e("role_id")."&t=".e('t'));
}
if (e('act')==md5('delete_child')){
$p->set("id",e("id"),"s");
$p->delete();
go("acm_edit.php?role_id=".e("role_id")."&t=".e('t'));
}

with this sample tables :
CREATE TABLE `acm_realm` (
`id` int(11) NOT NULL auto_increment,
`code` varchar(200) default NULL,
`role_id` int(11) default NULL,
`key_pattern` varchar(200) default NULL,
`date_added` datetime default NULL,
`parent_id` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=40 ;

CREATE TABLE `acm_role` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) default NULL,
`description` varchar(200) default NULL,
`value` bigint(20) default NULL,
`date_added` datetime default NULL,
`parent_id` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

CREATE TABLE `w_user` (
`usr_id` int(11) NOT NULL auto_increment,
`usr_username` varchar(100) default NULL,
`usr_password` varchar(100) default NULL,
`usr_role` varchar(20) default NULL,
`usr_parentid` int(11) default NULL,
PRIMARY KEY (`usr_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

What this acm do is check every request, either it is authorized or not. Checking is done by matching request url with key_pattern(url pattern). And it the request url is not authorized, user will be redirected to unauthorized notice page. In case propagate is not set to true during runtime, oneface can’t use forceLogout() feature, so, we have to check for login status from time to time.

oneface xzilim

It’s been a long time since I wrote my last post here. Okay, it’s 2010, start fresh. Lately, I’ve been concentrating with oneFace research in reeqSolution. Quite an enjoyable moment. Who has imagined that the simple script i wrote back then grows and become a full web framework and intensively used by reeqSolution. Then, lemme share the taste of oneFace. Currently, oneFace support both java and php.

Using persist for direct db manipulation:

$p = new Persist($DB_OBJ);
$p->setTable("tableName");
$p->set("column1",e("request_param1"),"datatype");
$p->set("column2",e("request_param2"),"datatype");
$p->insert();

“datatype” is either “s”,”i”,”d”,”b” (you should familiar with mysqli datatype);

“request_param” is usually the name of the input in form. this handles $GET, $_POST, $_SESSION and $_FILE (file handling will be discuss in next topic)

Persist provides lot of function. Some of inportant function :
getList(), get(), getPagedList(), referCode(), insert(), update(), delete(), getJoinList(), create(), execute(), loadShift() …etc, etc..

Usually in oneface, persist is coupled with ofaction class

typical ofaction for user CRUD

include "_set";
include PERSIST;
include DBCONFIG;
include ONEFACE;

$p1 = new Persist($DB_OBJ); // form-table mapping
$of = $req->getFace(); // oneFace propagator

$p1->setTable("tbl_user");
run($p1,$of); // entry point

// required for of-action class.
function populate(){
$p1->set("usr_id",e("txt_id"),"s");
$p1->set("usr_name",e("txt_name"),"s");
$p1->set("usr_nric",e("txt_nric"),"s");
$p1->set("usr_dob",e("txt_dob"),"s");
$p1->set("usr_pic",e("file_pic"),"b");
$p1->set("usr_address",e("txt_address"),"s");
$p1->set("usr_postcode",e("txt_postcode"),"s");
$p1->set("usr_city",e("txt_city"),"s");
$p1->set("usr_state",e("txt_state"),"s");
$p1->set("usr_email",e("txt_email"),"s");
$p1->set("usr_phone",e("txt_phone"),"s");
$p1->set("usr_date_added",e("txt_date_added"),"s");
}

// required : will be run if action parameter is "add"
function add($p1,$of){
$p1->insert();
$of->closeTab();
$of2 = addTab("user_view.php?id=".$p1->getAutoId());
$of2->focus();
}

// required : will be run if action parameter is "delete"
function delete($p1,$of){
$rv = $p1->delete();
if ($rv){
$of->closeTab();
}else{
$of->notify("Failed to delete data!");
}
}

// required : will be run if action parameter is "update"
function update($p1,$of){
$rv = $p1->update();
$of->notify($rv?"Data Successfully updated!":"Failed to delete data!");
}

// required : left empty for no validation. this method intercept further action.

function validation($p1, $of){
if (e("txt_name") == ''){
$of->message("txt_name","Name cannot be empty!");
}
// other validation
}

as you can see ofaction (OneFace Action Skeleton) provide a controller-like layer. ofaction provides oneface function and persist to deal with oneface front-end. Sometime oneface and persist coupled without being assist by ofaction class, or maybe i should say, can be embedded in front-end. For example, is dynamic datagrid.


$query = e("q");
$p1 = new Persist($DB_OBJ);
$p1->setTable("w_user");
$userlist = $p1->getList($query);
$of = $req->getFace();
$header = array("usr_name"=>"Name",
"usr_age"=>"Age",
"usr_phone"=>"Phone");
$of->setList($userlist, $header);
$of->populate();

There are numbers of oneface Face functions. Some of them are:

addTab(), closeTab(), go(), notify(), activate(), setMasterFaceInfo(), propagateUpdate(), litebox(), forceLogout(), forceRedirect(), addTrigger(), removeTrigger(), setTreeView(), updateTreeView(), pilot(), etc, etc...

So, we have persist dealing with back-end, ofaction become a controller and oneface Faces deals with front-end. From other view, this could be seen as MVC. The different is just, everything in oneface is ajax. You code addTab in server-side, but an optimized  javascript to add new tab and retrieved content via ajax will be sent. New feature as in v3.5 like notify(), forceLogout(), forceRedirect() is using ajax-push thingy (though I don’t really understand how, i know this action is triggered serverside, without the client have to initiate anything.

How to start using oneface?

you have to define oneface region in your page first. Normally I do this:

of_obj = {
"of_trigger" = "div_id",
"of_tabpane" = "div_id",
"of_view" = "div_id",
"of_treeview" = "div_id",
"of_strict_option" = false
}
oneface = new OneFace(of_obj);

Well, for most of oneface-ready template out there, you just have to change of_strict_option to true since most of the region is well defined. The example above is minimal oneface region target just to make it works.

Oneface covers mostly everything from access control, screen for reference code, reporting, admin page, templating, i18n with small blueprint. It’s crazily optimized for performance and speed without affecting the flexibility.

YConnect (using YMSG16 and programmed with .Net)

Lately, i’ve been tired of hexing others client. Too much limitation on that (though I LOVE the challenge from that). It’ll be worst damn difficult if the program used EXE Compressor(T_T couldnt have my hand on those resource pointer). Afterall, hexing is just to crack the software, not to fully modified the software.. Then, bye bye UltraEdit.. :(

Thanks to the “limitation”, I’m beginning to code my own chat client. Why do i have to create a new one when there are lot of free yahoo chat client out there?? The answer is simple, satisfaction.

Introducing, the new birth of chat client (not completed yet though…). For me, ability of ID polygamy in yahoo chat client is important. Therefore, this client I’ve developed able to do that in an organized way (not with lot of instances!!!).

Here is what I’ve done so far…

login

poly view

user main

Multiple chat view with YConnect!

Multiple chat view with YConnect!

So, what’s the fuss!??

Well, after all, i have to say, program the chat client isn’t really an easy task. Before I could comment on others chat client, “lack of this, lack of that!“, “doesn’t feel like using ym“,”client is too bulky! not user friendly!“, “client is just a social tool, not a hacker’s tool!“…for now, I’ll juz keep silence (hehehe)..

Chat client I love???

Actually, I like YSupra than others. First, the user interface is simple and up-to-date (not like those Yahelite, Yazak, I mean those bulky win2000 style, uweek). Second, because i can log on with it (i’m using sialcom broadband, got some problem with other client. Up to now, i have only 2 yahoo chat client(except my own YConnect) able to logged in from this damned connection. It’s Yahoo Messenger Local and Y!Supra.. After developing this client, I realized the cause of that problem.

1) When logging in, client will get token/crumb and exchange packet to login.yahoo.com which might not be resolve by sialcom broadband.
Resolution : Either both client connect directly using ip, and set SSL error policy to always true (since different hostname revoke the certificate.

2) yahoo 1236 error?! : In my case it is caused by the use of HTTP1.1 when sending packet. I’ve used this, and after few hours checking up the code, I’ve change the protocol to HTTP1.0 and voila, I’m able to logged on. actually, this code define somewhat of user account lock or of the sort. I’m not sure actually, but adding the case for this isn’t that painful ^_^

So, I’ve ended up with this (I’m using System.Net.HttpWebRequest here)

ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)

YNet1 = HttpWebRequest.Create("https://" & HostName & "/config/pwtoken_get?src=ymsgr&ts=&login=" & YahooID & "&passwd=" & Password & "&chal=" & YmChallenge)

YNet1.ProtocolVersion = HttpVersion.Version10 ' <- use Version10
YNet1.AllowAutoRedirect = True

YMSG16??? What’s new? What’s not so new?

YMSG16 is the protocol used in YM9 and most of other client out there using it (for NO5, hmmm, i have no comment on that). It’s damn difficult to log in but the packet defined the structure of the data in which i think is better. The example shown here is in VB.Net(2008) syntax. However, i could rewrite the code in VB6, C# and Java(not confident how to handle certificate though, but I gez I could try, hehe..)

Logging in to YMSG16:

This is the class i used to log in (THIS IS ORIGINAL, NOT RIPPED OFF FROM OTHERS, CAUSE I HATE WHEN PEOPLE ACCUSE ME FOR THAT!)


Option Strict Off
Option Explicit On

Imports System.Text
Imports System.Security.Cryptography
Imports System.Runtime.InteropServices
Imports System.Net
Imports System.IO
Imports System.Security.Permissions
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates

Friend Class Login
   Public Delegate Function ServerCertificateValidationCallback( _
   ByVal sender As Object, _
   ByVal certificate As X509Certificate, _
   ByVal chain As X509Chain, _
   ByVal sslPolicyErrors As SslPolicyErrors) As Boolean

   Public Function ValidateServerCertificate(ByVal sender As Object, _
      ByVal cert As X509Certificate, _
      ByVal chain As X509Chain, _
      ByVal ssl As SslPolicyErrors) As Boolean
      Return True
   End Function

   Public oEncoderAnsi As System.Text.Encoding
   Public Event InvalidLogin()
   Public Event RecvToken(ByVal Y_CookiePart As String, ByVal T_CookiePart As String, ByVal LoginHash As String)
   Public Event SckError(ByVal ErrorNum As Integer, ByVal ErrorDesc As String)
   Private WithEvents YNet1 As System.Net.HttpWebRequest
   Private WithEvents YNet2 As System.Net.HttpWebRequest

   Private SecureHost, HttpBuffer, YmsgChallenge As String

   Public Function getResponse(ByVal request As HttpWebRequest)
      Dim myHttpWebResponse As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
      Dim receiveStream As Stream = myHttpWebResponse.GetResponseStream()
      Dim encode As Encoding = System.Text.Encoding.GetEncoding(950)
      Dim readStream As New StreamReader(receiveStream, encode)
      Return readStream.ReadToEnd()
   End Function

   Public Sub GetToken(ByRef YahooID As String, ByRef Password As String, ByRef YmChallenge As String, Optional ByRef HostName As String = "66.163.169.186")
      On Error Resume Next
      Main.lbStatMsg.Text = "Sending Challenge"
      YmsgChallenge = YmChallenge
      ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)
      YNet1 = HttpWebRequest.Create("https://" & HostName & "/config/pwtoken_get?src=ymsgr&ts=&login=" & YahooID & "&passwd=" & Password & "&chal=" & YmChallenge)
      YNet1.ProtocolVersion = HttpVersion.Version10
      YNet1.AllowAutoRedirect = True
      YNet1.Method = "GET"
      con1_2(getResponse(YNet1))
   End Sub

   Private Sub con1_2(ByRef data As String)
      Main.lbStatMsg.Text = "Getting crumbs"
      On Error Resume Next
      Dim SplDat1() As String
      Dim SplDat2() As String
      If InStr(1, data, "ymsgr=") Then
          SplDat1 = Split(data, "ymsgr=")
          SplDat2 = Split(SplDat1(1), vbCrLf)
          ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)
          YNet2 = HttpWebRequest.Create("https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=&token=" & SplDat2(0))
          YNet2.ProtocolVersion = HttpVersion.Version11
          YNet2.AllowAutoRedirect = True
          YNet2.Method = "GET"
          con2(getResponse(YNet2))
     Else
          RaiseEvent InvalidLogin()
     End If
  End Sub

  Public Sub con2(ByRef data As String)
     Main.lbStatMsg.Text = "Got crumb"
     On Error Resume Next
     Dim SplDat1() As String
     Dim SplDat2() As String
     Dim YCookie, TCookie, YCrumb As String
     If InStr(1, data, "crumb=") > -1 Then
     SplDat1 = Split(data, "Y=")
     SplDat2 = Split(SplDat1(1), ";")
     YCookie = SplDat2(0) & "; path=/; domain=.yahoo.com"
     SplDat1 = Split(data, "T=")
     SplDat2 = Split(SplDat1(1), ";")
     TCookie = SplDat2(0) & "; path=/; domain=.yahoo.com"
     SplDat1 = Split(data, "crumb=")
     SplDat2 = Split(SplDat1(1), vbCrLf)
     YCrumb = SplDat2(0)
     Dim crypted As String = ProcessAuth16(YCrumb, YmsgChallenge)
          Main.lbStatMsg.Text = "Logged In!"
          RaiseEvent RecvToken(YCookie, TCookie, crypted)
     End If
  End Sub
  Public Function ProcessAuth16(ByVal Crumb As String, ByVal Challenge As String) As String
     Dim Crypt As String = String.Join(String.Empty, New String() {Crumb, Challenge})
     Dim Hash As Byte() = HashAlgorithm.Create("MD5").ComputeHash(Encoding.[Default].GetBytes(Crypt))
     Dim Auth As String = Convert.ToBase64String(Hash).Replace("+", ".").Replace("/", "_").Replace("=", "-")
     Return Auth.ToString
  End Function
End Class

This one is pretty simple and not too bloated like other example on the web. But first, I wanna thanks YCoderCookBook for his YTainer sourcecode reference, carbonized.co.uk for his explaination on YMSG16 login packets.

As you can see from the code, I’m using System.Net.WebHttpRequest in which is networking class in .Net framework. Using INet (I bet many of client out there using this) is too oldschool. WinHttp is another alternative, but I want to rely only on .Net and not COM.

So, what’s with YConnect?!!

As you can see, YConnect use a fairly simple user-interface (thanks to dubee of YSupra for the inspiration) without losing most of the option.  For id polygamy, it’ll just run in one instance of the program, with tab in which i think is quite great. I always think, it would be great if YSupra has buddylist much like Yahoo Messenger, so, I’ve build one. However, I’m using Treeview with OwnerDraw, I have to think if there’s a way to retrieve the user avatar asyncronously since retrieve avatar for every paint update is CPU-killing. Maybe I’ll setUp a hashMap for user avatar later.

Here’s the code in tvBuddyList_DrawMode()

       If (e.State And TreeNodeStates.Focused) <> 0 Then
            Dim focusBounds As Rectangle = NodeBounds(e.Node)
            focusBounds.Size = New Size(focusBounds.Width, focusBounds.Height)

            e.Graphics.FillRectangle(Brushes.LightGray, 0, focusBounds.Y, tvBuddyList.Width, 36)
        End If

        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias

        Dim data As String = e.Node.Tag
        Dim sep As Char = Convert.ToChar(860)
        Dim type As String = data.Split(sep)(0)
        Dim text As String
        Dim status As Boolean
        Dim statusmsg As String
        Dim bound As Rectangle = NodeBounds(e.Node)
        If type = "group" Then
            Dim fx As New System.Drawing.Font("Verdana", 8.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
            text = data.Split(sep)(1)
            Dim pt() As Point = {New Point(bound.X + 6, bound.Y + 15), New Point(bound.X + 6, bound.Y + 23), New Point(bound.X + 15, bound.Y + 19)}
            e.Graphics.FillPolygon(Brushes.Black, pt, Drawing2D.FillMode.Winding)
            e.Graphics.DrawString(text, fx, Brushes.DarkViolet, bound.X + 20, bound.Y + 13)
        ElseIf type = "buddy" Then
            ' Debug.Print("drawing..")
            text = data.Split(sep)(1)
            status = (data.Split(sep)(2) = "online")
            statusmsg = data.Split(sep)(3)

            Dim fStyle As FontStyle = IIf(status, System.Drawing.FontStyle.Bold, System.Drawing.FontStyle.Italic)
            Dim fx As New System.Drawing.Font("Verdana", 8.0!, fStyle, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
            Dim fx1 As New System.Drawing.Font("Verdana", 7.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
            Dim o9color As Brush = IIf(status, Brushes.Orange, Brushes.LightGray)
            Dim o9color2 As Pen = IIf(status, Pens.DarkOrange, Pens.Gray)

           ' Dim ava As New PictureBox
           ' ava.LoadAsync("http://img.msg.yahoo.com/avatar.php?format=jpg&yids=" & e.Node.Text.Split(sep)(0))
           ' Draw avatar from HashTable of <string, Image>
            e.Graphics.DrawImage(avaHashMap(e.Node.Text.Split(sep)(0)), bound.X + 5, bound.Y + 5, 30, 30)
            e.Graphics.FillEllipse(o9color, New Rectangle(bound.X + 40, bound.Y + 6, 8, 8))
            e.Graphics.DrawEllipse(o9color2, New Rectangle(bound.X + 40, bound.Y + 6, 8, 8))
            e.Graphics.DrawString(text, fx, Brushes.DarkSlateGray, bound.X + 54, bound.Y + 3)
            e.Graphics.DrawString(statusmsg, fx1, Brushes.Gray, bound.X + 40, bound.Y + 17)
        End If

Well I’ve got YM-styled buddy list soo far. I’ll just have to build the treeNode inside the tvBuddyList, with buddy tree tag set to

 type["group"|"buddy"] & Char(860) & buddyname & Char(860) & status["online"|"offline"] & Char(860) & statusmessage

everytime the buddy status change, just change the key for the treeNode corresponding to the buddy.

Problem I faced so far

I have problem with captcha image. Actually, I wanna make the captcha image to appear into chat browser. Only captcha Image. Like those on YSupra. But maybe lack of knowledge, I’m not able to do that. Everytime I try to retrieve the captcha image from the ImgUrl parameter given when signing in to room, it got invalidated. Hurghhhh!!

No security feature in this client yet. I dunno if this client is easily booted, haven’t test for that. But given the nature of boot is by the inability of the client to process massive packet, maybe I’ll have workaround on that later.

Duplicate PM msg problem. I dunno if this problem is common or not, but I have found post regarding this issue. Chat server will send 2 packet, technically. But maybe I’ll resolve this issue later (juz few conditional block anyway).

Only using YMSG16 protocol. Well I think I’ll just leave it at it. YMSG14 has been deprecated and for YMSG15, i guess there’s not much difference from YMSG16 except for login process (I’ll added later). For YMSG17, I’ll produce the code when it is widely used later (i gez some folk in YSupra has a workaround on this) ^_^

Conclusion

I’ll happily give out the full sourcecode, ONLY if you wanna help me on problems I’ve faced. I have the same project for VB.Net (but using YMSG14 on this time,  later I’ll add support for YMSG16)

~pre-reengineer

I’m currently trying to re-ingeneer some of wordpress part to be compatible with oneFace presentation layer. Trying to maintain current structure.
For now, it’s only 80% of admin stuff in WP installation has completed and 20% of blog itself.

The way it was, I wonder how would it be if it was developed using JSP/Servlet/Javabean.
While studying the underlying structure I came to conclusion, it’s far maintainable using Java technology than php (just from my point of view).

Even though the abstraction in architecture was fully met, it’s setting par in flexibility of how far we can go with the core. Differ from O-O approach (which for me, has both abstraction and flexibility since it’s treated in modular and discreet), one would have to think twice to change the behavior in functionality of the system.

Here is the link for current work.
OneFace WordPress Hybrid

~kinda “live preview” in Netbeans?

Recently, I have posted something about netbeans 6.7 and Dreamweaver CS4. In that post, I was telling how bad I want a “live preview” functionality (even though I’ve given up on WYIWYG jsp editor) in Netbeans 6.7.

Now It's 60% netbeans 40% dreamweaver!

Now It's 60% netbeans 40% dreamweaver!


As you can see, it’s now much better for rapid development! One of the cycle (leave IDE -> browse to the page -> reload -> get back to IDE) is now excluded from whole development experience. This is the version available in netbeans developer trunk. The feature is scheduled for Netbeans 6.8 release(tentative). The browser is using XULRunner(gecko) renderer engine, which is used by Mozilla Firefox. There is a meeting among Netbeans team and Webkit developer discussing on possibilities for netbeans to use WebKit instead (actually, the meeting is mainly for AWT team to port webkit for use in java), but it seemed to take a lot of time in which might cause development postpone for presentation-layer team.

Just something…
-EmbeddedBrowser in this release quite similar with what has Prakash had discussed. I bet this use the same approach, JDIC.
…if so, JDIC even capable to create WYSIWYG html editor(this is what I’ve seen from JDIC example/sample), then, maybe it’s close to that…
-JWebPane << maybe worth a look…
-Prakash had proposed Generic Visual Webpage Designer before he close it(when he changed to Aptana Studio, but now he’s back << read from his blog), some of the idea has been implemented, why don't trying to look back…?

-..what do y'all think?

~don’t boast’em up!

ASP.Net vs J2EE vs PHP? C# vs C++ vs Java? Only those stupid would ask..I can make fun of these languages as much as I can coz they owez being funny with me(regardless of what features it got or how cool the buzzwords derived). I do have my own principle.

  1. Design the well architecture
    -This is WHERE the SCALABILITY comes, not from the language!
  2. Alternative of not to use external module/library and make use of STANDARD like xml, sql to the most even with logic
    -This is WHERE the PORTABILITY and INTERACTABILITY comes, not from language, since I can write the same simple-iterative-logic implementation in various language!
  3. Don’t touch the code if you just wanna show-off the capability of your preferred language
    -The most IMPORTANT of all. For me (well, I dont know others..), capability is achieved through DESIGN and PROBLEM SOLVING techniques. Don’t become too language-dependent. It’s enough if you know how to solve the problem. Write the flow in pseudocode. Every language got it’s own STANDARD way to perform certain task. I’m bored listening to people boasting how well is PHP-MySql coupling or JSP/Servlet-Oracle coupling. PHP can do that, JSP can do this…blablabla..Only people who can’t do things with bare-handed would say that!
  4. Choose the correct design strategy for your system.
    - Here comes the solution for PERFORMANCE issue. Waste of time to argue which language got performance!
  5. Project’s well-planning
    - This should  solve  all those lengthy time taken to develop the system. No language can be coded faster than others. It’s just the same. So, stop googling for best language to develop system faster. In a way, you’ll just waste your time.
  6. Well documented system
    - Once, again, here comes MAINTAINABILITY, not with the language!

Well, I guess, that concludes everything. IMHO, galactic knowledge in programming doesn’t come any handy without the ability to manage project well. Yeah, even students from Faculty of Management and Economy could write php, jsp, java, .Net, vb6, c++ even c. But what I’ve learned from my years in Software Engineering isn’t solely programming, but more than that, project management, system analysis, etc.. Lecturers don’t teach me my 7 languages, but they teach me how to beautify my language and turn’em into meaningful and marketable product. Heheh.

Follow

Get every new post delivered to your Inbox.