Friday, June 30, 2006

Linux: My Painless Experience Installing Ubuntu

I had a change of heart last night on my recovery efforts, and decided to wipe out my Windows install in favor of Ubuntu 6.06. I had copied cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desktop Live CD in anticipation of my recovery, and so I decided to give it a whirl. I have to say, I am impressed and really feel that this is what Desktop Linux should be. I apologize beforehand for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lack of screenshots, VMWare was not cooperating with me, and I had no way to capture screenshots off my laptop during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 installation process.

Installation:
     The installation kind of threw me for a loop. Its is a different paradigm than what I am used to with OS installs, where you throw in a CD, go through some sort of wizard or configuration menu, and install cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS. Ubuntu doesn’t do that. Ubuntu follows a “try before you buy” method, where you boot into a full fledged Live CD version of Ubuntu and get to trial it before you install it. This is great if your trying to convince someone of all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtues of Linux and want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to try it out, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y agree, and you install it as is right to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir system. No fuss whatsoever. I personally like this paradigm a little more since I have a few potential converts and I would like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to try it out first.

When I first pop in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CD, I am greeted with a startup menu. I am impressed with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inclusion of a software memory tester, and I will keep that handy for future diagnostic use. Choosing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 boot option starts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Ubuntu load screen giving you cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 status of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 boot process. This is a little prettier than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 nasty status screens, however it is not very useful for diagnostics. I will have to remember to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 option for that.

Once loaded, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is greeted with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gnome desktop. There is one icon of particular interest here, which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Install Icon. This is how you initiate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Install process for Ubuntu. A bit different for an OS install, but I like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea of a test-drive before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 install. Once you click on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Install Icon, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 installation wizard starts and asks a series of simple questions. The most difficult one, especially for Grandma, will be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disk usage one. I just selected use entire disk, thus wiping out my previously restored Windows disk image. After copying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 files to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hard disk, it asks if I want to continue with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Live CD, or reboot into my newly installed Ubuntu installation. This just puts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Debian and Gentoo installs to shame, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n again, those distros target different audiences.

Post-Installation:
The first thing that I noticed immediately was that every single one of my devices was recognized right out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 box. This impressed me. Even my bizarre, crappy USB Wireless adapter was recognized, and it never was recognized in Fedora Core or Debian previously without recompiling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel. The only modification I had to make was to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WEP configuration. I seems I forgot cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WEP key I was using, and had to reconfigure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WAP with a new key. I also had to install MP3 support, which is not included out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 box. Instructions for doing so are here and here (Note: with link 2, read that document carefully. It covers how to get all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Restricted” formats from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Ubuntu package repositories called “Universe” and “Multiverse”). Once done, I was able to plug my Ipod into my laptop and play music directly off of it using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default music player. Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting thing to note is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 small amount of services that start with it. I am used to Debian and Fedora starting a ridiculous number of services. This was not a problem with Ubuntu. In fact, I only had to stop about 3 unwanted services. Not bad. I am impressed with Ubuntu. My only gripe is using Gnome. I much prefer KDE, so I probably should have installed Kubuntu, which is Ubuntu with KDE. I can change out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desktop managers via Synaptic, however I think I will stick with this for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time being. There are things in Nautilus that I like, so I am going to keep with it for a few months.



Thursday, June 29, 2006

Incident Response: Recovery via Knoppix 5.0.1

So I had a chance to begin cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 road to recovery from my system infection. The great thing is, Knoppix provides such as convenient way to wipe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 drive and restore my disk image, so I am back up to running with nothing more than about an hours worth of inconvenience. Plus, as an added bonus, I now have Knoppix 5.0.1, which is great since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last version I had was in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 3.x series.

Here were my steps to recovery.

  1. Have a previous disk image of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system from a known good time. I keep cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se images on a removable USB hard disk that I keep just for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se emergencies. I periodically update cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se images (roughly once every 3 months).

  2. Boot into Knoppix.

  3. I actually used my Ipod Video to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 backups of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 files that were not in my image. Luckily, Knoppix recognized cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Ipod as a removable storage device, so all I needed to do was copy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 files over.

  4. Wipe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 drive. This step really isn’t necessary, but I did so out of spite to destroy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 infected disk image. On some primitive subconscious level, this satisfied me in a way that beating down a delinquent payee must satisfy a bookie. The steps to wipe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 drive are to run DD using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following command:”dd if=/dev/zero of=/dev/hda bs=100k count=1000”This won’t wipe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole drive, but it will wipe out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MBR and partition information and render cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disk unbootable.

  5. Restore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disk via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous disk image. Knoppix likes to mount USB drives as SCSI drives, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 designation that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 USB drive had when plugged in was SDA1. The drive gets auto-mounted on plug-in. To restore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disk is pretty easy, and I outlined cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steps in this article, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no need to repeat.

  6. Reboot without Knoppix in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CD Drive and away I go.

So now this whole ordeal is behind me. I must admit a little embarrassment in having gotten cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virus to begin with, however my recovery time cost me a total of an hour of sitting and waiting for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disk to re-image, which is time I spent catching up on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 episodes of “The Shield” that I rented. And I deny cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spammer a zombie machine. Too bad cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are millions more out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re.

Wednesday, June 28, 2006

OS: FreeDOS Ceases Development

I was a little disappointed to read about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 discontinuation of development for FreeDOS. While DOS has been “dead” for a long time now, I still like to go back and get a little nostalgic for, what I consider, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Golden Age of Computing. DOS, while primitive, offered some really interesting and educational features, such as direct device access, that modern operating systems deny users due to privileges. I’ve always felt that DOS made a good stepping-stone to understanding PC functions before moving into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more modern OS arena. It’s also kind of sad when developers give up on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir hobby due to lack of interest from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 community. Since it has been moved to Sourceforge, perhaps anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r group will take up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flag and bring this OS into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 1.0 version. But with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux fanboys questioning why, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows group laughing at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 obsoleteness of DOS, I doubt anyone will.

Tuesday, June 27, 2006

VB: Change String Case

A real simple question came across my way. The question was “How can I change case with a Visual Basic string?”

Visual Basic provides two functions for changing case, Ucase and Lcase. Consider cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following example. Here, I am going to traverse through a string, and switch cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of each individual character. In function 1, I am going to use a Byte array and switch cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of each element in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array. In function 2, I will build a temp string using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VB string function MID. The string is in a textbox called Text1.

Public Sub Function_1()
    Dim ary() As Byte
    Dim x As Integer
    
    'Set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array size to equal cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of our string. Use lenb to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual byte size
    ReDim ary(LenB(Text1.Text))
    
    'Assign cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 byte array
    ary = Text1.Text
    
    'For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array, go through each character and change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case
    'Remember, this is a byte array, so it compares using numbers, so use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365
    'asc function to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ascii value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 characters to compare against.
    For x = LBound(ary) To UBound(ary)
        If (ary(x) >= Asc("a")) And (ary(x) <= Asc("z")) Then
            'using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chr and asc function, change to a character, change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case
            'and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n switch back to an ASCII number.
            ary(x) = Asc(UCase(Chr(ary(x))))
        Else
            If (ary(x) >= Asc("A")) And (ary(x) <= Asc("Z")) Then
                ary(x) = Asc(LCase(Chr(ary(x))))
            End If
        End If
    Next
    
    'Display cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result
    MsgBox ary, vbOKOnly
End Sub

Public Sub Function_2()
    Dim temp As String
    Dim x As Integer
    
    For x = 1 To Len(Text1.Text)
        If (Asc(Mid(Text1.Text, x, 1)) >= Asc("a")) And (Asc(Mid(Text1.Text, x, 1)) <= Asc("z")) Then
            temp = temp & UCase(Mid(Text1.Text, x, 1))
        Else
            If (Asc(Mid(Text1.Text, x, 1)) >= Asc("A")) And (Asc(Mid(Text1.Text, x, 1)) <= Asc("Z")) Then
                temp = temp & LCase(Mid(Text1.Text, x, 1))
            Else
                temp = temp & Mid(Text1.Text, x, 1)
            End If
        End If
    Next
    
    MsgBox temp, vbOKOnly
End Sub

Incident Reponse: I Got a Virus

Sometimes I deserve a big kick in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 arse. Last night while browsing, I zigged when I should have zagged and caught a nasty little virus. I wasn’t browsing porn sites, if that’s what your thinking, which is too bad, at least I would have gotten some eye candy for my trouble. But I am not too upset, I have been looking for a good excuse to re-format this machine. The virus/virii have all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same staples of recent malware, such as annoying pop-ups, and lame attempts to put things into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows startup, and really lame attempts to try to convince me that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are, in fact, virus scanners warning me of an infection. I didn’t check outbound traffic, but I’m sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s some attempts to spam. Virus scanner failed to pick it up and AdAware is not finding it in scans, and removing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 startup items didn’t stop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m from reappearing. Plus, really strange DLL files appeared and are loaded from startup. Attempting to delete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DLLs failed, even from safe mode, or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y too re-appeared. Oh well, it happens. I could probably remove it with some persistence, however I am chalking it up as a compromise. With no faith in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system it is time to implement cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Incident Response plan. Fortunately this is a non-critical system, so I’ve isolated it from phoning home and from infecting any furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r systems, or from being a pain and spamming. Reformatting and re-installing is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only viable option at this point. The plan is as follows:

-Boot from a trusted media to backup a few key files that are not already backed up, such as a VMWare DOS virtual, photos of my trip to Vegas and some COBOL source code
-Wipe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 drive
-Reinstall an OS (eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Windows or Ubantu, haven’t decided). Fortunately I do have a trusted disk image, so it will only require a good ‘ole DD of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disk from that image.
-Restore backups except for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 photos. Those will need to be verified individually to insure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have not been tampered with by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 infection.

The lesson here, besides to practice safe browsing habits is in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 event of a compromise, trust cannot be re-obtained, so be sure to have a good Incident Response Plan.

Monday, June 26, 2006

Oracle: Oracle Uninstall

Sometimes working with Oracle can be a big pain in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 backside, especially when trying to uninstall and ensuring that all components have been removed. Case in point, we had an employee whose desktop application failed to connect to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 backend database correctly after having her machine reformatted and “re-imaged”. The image file came pre-installed with an Oracle 8.0.5 client. Kind of made things difficult to connect to an Oracle 9i Server. Racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than playing around with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 TSNNAMES.ORA file to resolve this, I opted to upgrade cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system in question to Oracle 9i. This is where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “Help Desk” failed. First, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y couldn’t find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Uninstall option in Add/Remove programs, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y didn’t uninstall cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old version. Then, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y just applied anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r “image” of Oracle 9, which was corrupt. They didn’t bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r removing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old Oracle from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PATH statement, set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 9i version in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HOME setting, so of course, this didn’t work. The system could not connect through ODBC, testing through a UDL file, or through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desktop client. Sql-Plus worked, but only with version 9. Luckily I was able to get this resolved. Here are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 steps I followed.


  • Uninstalled version 8.0.5 via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Oracle Universal Installer.

  • Uninstalled cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Corrupt 9i via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Universal Installer.

  • Removed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old Oracle 8.0.5 entry from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path statement (C:\orant\bin).

  • Backed up and deleted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C:\OraNT directory.

  • Backed up and deleted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C:\Oracle directory.

  • Removed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following registry keys (Note, * are wildcards):

  • Hkcu/Software/Oracle

  • Hklm/Software/Oracle

  • Hklm/Software/odbc/Microsoft/ODBC for Oracle

  • Hklm/software/odbc/odbcinst.ini/Oracle*

  • Hkey/Classes/root/(ora*, orcl*, oradc*, orammc*, oraole*, oraperf*)

  • Hkusers/software/oracle

  • Hkusers/s-(long number here)/Software/Oracle

  • Hklm/SYSTEM/ControlSet00*/ Services/ (Oracle*)

  • Hklm/SYSTEM/ CurrentControlSet/ Services/ (Oracle*)

  • Reinstalled Oracle 9i Client fresh from CD.

And that resolved cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connectivity issues.

Thursday, June 22, 2006

Programming: XML-RPC Example

Thanks to OSNews.com for posting this IBM Developerworks Article about XML-RPC. Web Services are an interesting topic, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are a few standards out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re for implementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. This article describes a program that exposes a simple “Add” method in C++ as a web service. Neat stuff.

Wednesday, June 21, 2006

Programming: Don't Program When Programming isn't Required

My friend Richard Bejtlich recently asked for help with a website redesign. Considering my ever-low opinion of programmers who are under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 assumption that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are web designers, I offered my usual advice of “hire a professional”. In a case like his, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web site he has provides information on his business, so offering goofy JavaScript or database interactions seems a little outside of his scope. Since this is basically an electronic brochure, I recommended that he find a graphic artist. Not every project requires programming, and adding a PHP backend or unnecessary additions can introduce unexpected results (IE: it would be embarrassing for a security consultant to have his website hacked).

Tuesday, June 13, 2006

Excel: Creating Static SQL Insert Statements Via Macro

There are times that I don’t particularly need to insert data from a spreadsheet right into a database, but would racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r have a script generated or a series of SQL statements generated from spreadsheet data. I usually do this in cases where I have a set population sent to me via spreadsheet, and I am creating a script to initialize tables. This way, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 even of a crash or if I need to set up a QA/UA/Testing environment, I can simply run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script and have my initial tables and sample data ready to go. This works out great when I have a set population for an online report.

The easiest way to do this from Excel is using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debug.print statement, which will output text directly to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Immediate window. This has some drawbacks, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 immediate window can only hold so much data. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script that is generated is large, I can output directly to a file, or into anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r sheet. Below is a sample macro that will generate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 insert statements I need based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sample form in Figure 1 and display cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 immediate window. This can easily be modified if needed to output to a file or to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r sheet inside of a workbook.


Figure 1. The Form

Option Explicit

Private Sub cmdAddCol_Click()
'Add if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is something in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 textbox
If txtColumn.Text <> "" Then
lstCols.AddItem txtColumn.Text
End If

'Clear and set focus back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 textbox
txtColumn.Text = ""
txtColumn.SetFocus
End Sub

Private Sub cmdAddField_Click()
'Add if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is something in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 textbox
If txtField.Text <> "" Then
lstFields.AddItem txtField.Text
End If

'Clear and set focus back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 textbox
txtField.Text = ""
txtField.SetFocus
End Sub

Private Sub cmdClose_Click()
'Close cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form
Unload Me
End Sub

Private Sub cmdCreate_Click()
Dim sql_prefix, sql, sql_suffix As String
Dim LastRow, x, y As Long
Dim temp As Variant

'Get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of cells. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are 0, exit this function
If WorksheetFunction.CountA(Cells) > 0 Then
LastRow = Cells.Find(What:="*", After:=[A1], _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
Else
MsgBox "There are no cells in this sheet!"
Exit Sub
End If

If lstCols.ListCount <> lstFields.ListCount Then
MsgBox "Field count does not match Column Count"
Exit Sub
End If

'Create out prefix and suffix
sql_suffix = ");"
sql_prefix = "insert into " & txtTable.Text & " ("

''Add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fields to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 prefix
For x = 0 To (lstFields.ListCount - 1)
sql_prefix = sql_prefix & lstFields.List(x) & ","
Next

'Remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extra comma and add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remainder of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 prefix
sql_prefix = Left(sql_prefix, Len(sql_prefix) - 1)
sql_prefix = sql_prefix & ") values ("

'Now, create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual queries to use for each row in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sheet
For x = 1 To LastRow
'Preset SQL to equal cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 prefix, clearing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last loop
sql = sql_prefix

'For each column listed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list box
For y = 0 To (lstCols.ListCount - 1)
sql = sql & "'" & Range(Trim(lstCols.List(y)) & Trim(Val(x))).Value & "',"
Next

'Remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extra comma and append cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 suffix. Then print cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results
'to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 immediate window
sql = Left(sql, Len(sql) - 1)
sql = sql & sql_suffix
Debug.Print sql
Next
End Sub

Now, all I need to do is fill out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SQL statements will be generated for me. I can use this to generate my initial scripts based on a user population.

Monday, June 12, 2006

A Simple AJAX Report Form

I have always been a big supporter of desktop applications. I have always found cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trend to try and throw everything into a web application a questionable and ridiculous attempt to capitalize. This is especially true for transactional applications, such as banking software. In my opinion, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overhead more that outweighed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 benefits in. Due to that line of thinking, I have been incredibly hesitant to try and accept AJAX. However, I must admit, after actually diving into it and trying a few simple pages, I can see where it can help to bridge cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gap between my coveted desktop applications and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slow, kludgy web apps I have come to expect.

This article is in no way a tutorial on AJAX. There are plenty of excellent articles on AJAX programming, books, and all sorts of information to help someone get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir feet wet. I recommend this IBM Developerworks Series. This article will simply highlight my experience with completing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form I discussed last article.

The goal of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form is to have it call a BIRT report and display cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form page itself, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than making a page switch or display cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting page in a frameset, which I have always found to be ugly. The parameters that will be passed into my BIRT report come from two form fields, which are populated using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calendar component mentioned in my last article.

Here are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScript snippets used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code.



This is borrowed directly from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IBM developerworks page. This will create a new XMLHttpRequest object, regardless of which browser family is used (IE or Standard, I have only tested with Firefox, IE, and Mozilla).

function callServer() {
  // Get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start and end date from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web form
  var start_date = document.getElementById("start_date").value;
  var end_date = document.getElementById("end_date").value;
  var cd_loc = document.getElementById("cd_loc").value;

  // Only go on if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are values for both fields
  if ((start_date == null) || (start_date == "")) return;
  if ((end_date == null) || (end_date == "")) return;

  // Build cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL to connect to
  var url = "http://localhost:8080/birt_viewer/run?__report=RoomUtilizationReport.rptdesign&Start_Date=" + escape(start_date) + "&End_Date=" + escape(end_date) + "&LocationCode=" + escape(cd_loc);
  
  // Open a connection to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server
  xmlHttp.open("GET", url, true);

  // Setup a function for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server to run when it's done
  xmlHttp.onreadystatechange = updatePage;

  // Send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request
  xmlHttp.send(null);
};

This function will make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 call BIRT for my report using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 xmlHTTPRequest object. First, we get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parameters by using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 getElementByID functions for each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following form fields, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start and end date which specify a date range to search in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cd_loc field, which specifies a location code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report. This doesn’t matter since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report isn’t really cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heart of this article. Next we make sure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 required fields are not null. Then we build cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BIRT Report Server URL to call to retrieve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report. Next, we setup cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 xmlHTTPRequest object using our constructed URL, and setup cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 callback function to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 updatePage function, which I will discuss next. Then we send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server. This will happen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “background” of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user will be none cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wiser.

function updatePage() {
     //If we have recieved a response
     if (xmlHttp.readyState == 4)
     {
          var imageElement = document.getElementsByTagName("processingIcon")[0];
          //If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parent node exists and is not null, process this
          if (imageElement)
          {
               var parentElement = imageElement.parentNode;
               parentElement.removeChild(imageElement);
          }
          //Create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 element to contain our returned HTML page from BIRT
          var childElement = document.createElement("report");

          //Set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 innerHTML code to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 returned report page
          childElement.innerHTML = xmlHttp.responseText;

          //Go through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM tree until we find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 body element
          var bodyElement = document.getElementsByTagName("body")[0];
                         
          //Find and remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old section, if it exists
          if (bodyElement.hasChildNodes()) {
               for (i=0; i
                          var oldElement = bodyElement.childNodes[i];
                         if (oldElement.nodeName.toLowerCase() == "report") {
                         bodyElement.removeChild(oldElement);
                         i--;     
                         }
               }
          }
          
          //Append our Report result intot he HTML body
          bodyElement.appendChild(childElement);
     }
     else
     {
          //Display a animated gif to give cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impresion of a processing bar
          var childElement = document.getElementsByTagName("processingIcon")[0];
          
          if (!childElement)
          {
               var childElement = document.createElement("processingIcon");

               childElement.innerHTML = '';

               var bodyElement = document.getElementsByTagName("body")[0];
               var reportElement = document.getElementsByTagName("report")[0];

               if (reportElement)
               {
                    bodyElement.insertBefore(childElement, reportElement);
               }
               else
                    bodyElement.appendChild(childElement);
          }
     }
};

This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most complex part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page. The basic logic flows like this:
     If response. readyState from xmlHTTPRequest is == 4 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n
          -Remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processing icon if present
-Create new page element called report, and put result from request into this new section
-Remove all old report sections so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are no duplicate reports in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same page
-Add newly created section to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page
     else
          -Check to see if processing Icon is present
-If no processing Icon is present, create a new section and display an animated Icon for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to look at, giving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impression of processing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is an already present report section, insert before this. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, just put at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page.
     
To check cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 readyState of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 xmlHTTPRequest object, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following code is used:

          xmlHttp.readyState == 4

For reference, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 readyState codes are as follows (as borrowed from here):
0 = uninitialized
1 = loading
2 = loaded
3 = interactive     
4 = complete
As far as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processing Icon, I could have put in a branch if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 readyState was equal to 1, but I chose cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lazier path. To create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Processing Icon, first I checked if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 section containing it exists using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following code:
var childElement = document.getElementsByTagName("processingIcon")[0];
          
     if (!childElement)

This way, if childElement does not exist, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 element does not exist on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page. The reaction of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script to display cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processing icon is based off of this. I am sure some JavaScript guru can tell me a better way to do this, however this works fine for me.

The rest should be self explanatory, or at least understandable if you read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IBM Developerworks articles.

A few things became pretty apparent while working with AJAX. First, AJAX not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ultimate answer to all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 webs problems. While it is a cool architecture, AJAX alone lacks structure, and it lacks a formal framework. AJAX also has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential to suffer from abuse, which is something I hate to break to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fanboys. Picture this, you’re cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dirt-bag spammer/online advertiser. Pop-ups and cookies are no longer an option for you to trap personal information from browsers. So what do you do? AJAX is new, and no subject to suspicion just yet, so you create a simple function that posts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browsers information via an AJAX call, and since this is done Asynchronously, it is done without cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 users knowledge or consent. This is of course assuming that this is not already being done. AJAX also suffers from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inability to design itself. While it is a powerful tool, its usage can be less than spectacular if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 design of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 site is poor.

Wednesday, June 07, 2006

Simple JavaScript Code to Hide DIV Tag

Recently I was working on a web-based report for a project I was working on. Since I typically do not do web development, I wanted to do some work with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AJAX and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM. I will cover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AJAX part in a separate article. Granted, DOM and JavaScript manipulation is anything new or exciting anymore, however I don’t do much in it, so it was a welcome change of pace.

The requirements were fairly simple since this was just an experiment on my part. I wanted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form to submit via an AJAX call to a BIRT report server, display in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same page, and have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form, all using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM to manipulate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 appearance on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page.

The form itself has two date input components. Racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than reinvent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wheel, I leveraged an existing HTML calendar component from here. This did everything I needed and more. Instructions for setting it up are available in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 package itself.

As far as hiding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form, created a DIV tag surrounding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form element and labeled it reportForm. I cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following function to remove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form:

function hideForm()
{
     var formElement = document.getElementById("reportForm");
     var parentElement = formElement.parentNode;

     parentElement.removeChild(formElement);
};

I assigned this function to a HTML Button component on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 onClick event. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function I could have given cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form a name, and used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function documents. GetElementsByTagName, however if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is more that I want to hide than just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form, a DIV tag will group cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, so this was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method that I chose.

This in itself, isn’t really exciting. However, when I cover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AJAX call, that will be a little bit more interesting.