GAM Posted September 15, 2009 Share Posted September 15, 2009 Hi, I have been asked to develop a tool that generates Graphs of any counter like 'QuotaNonPagedPoolUsage', 'QuotaPagedPoolUsage', 'ThreadCount', 'VirtualSize' etc for any particular process. So I have written the below script BUT the issue is, when this tool is run for more than 10-15 minutes continously then the 'CPU Utilization' and the Memory' of this script goes very high. The CPU sometimes reaches 70%, 80%..... Can somebody please help me out with an idea on how to solve this issue? Please let me know if anyone likes to have any more information. #include <Misc.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <GDIPlus.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> #Include <GuiButton.au3> #include <Constants.au3> #include <file.au3> #include <FontConstants.au3> Dim $Width = 650 Dim $Height = 380 Dim $Process = "" Dim $list $list = ProcessList() For $i = 1 to $list[0][0] $Process = $Process & "|" & StringUpper($list[$i][0]) Next $Main_Wnd = GUICreate("Process Performance", $Width, $Height, -1, -1, -1, $WS_EX_TRANSPARENT) GUICtrlSetBkColor($Main_Wnd , $GUI_BKCOLOR_TRANSPARENT) GUICtrlCreateGroup("Process and Counter", 30, 30, 255, 90) $Proc_TextBox = GUICtrlCreateCombo("Process Name", 50, 55, 150, 20) GUICtrlSetData($Proc_TextBox, $Process, "item3") GUISetState() $Counter_Combo = GuiCtrlCreatecombo("Handle", 50, 85, 150, 100) GUICtrlSetData($Counter_Combo, "HandleCount|KernelModeTime|MaximumWorkingSetSize|MinimumWorkingSetSize|OtherOperationCount|" & _ "OtherTransferCount|PageFaults|PageFileUsage|PeakPageFileUsage|PeakVirtualSize|" & _ "PeakWorkingSetSize|PrivatePageCount|QuotaNonPagedPoolUsage|QuotaPagedPoolUsage|" & _ "QuotaPeakNonPagedPoolUsage|QuotaPeakPagedPoolUsage|ReadOperationCount|ReadTransferCount|" & _ "ThreadCount|UserModeTime|VirtualSize|WorkingSetSize|WriteOperationCount|" & _ "WriteTransferCount", "item3") $GO_Btn = GuiCtrlCreateButton("Start", 220, 54, 50, 50) GUICtrlCreateGroup("", 300, 30, 325, 90) $Progress_Label = GUICtrlCreateLabel ("", 320, 53, 200, 20) GUICtrlSetBkColor ($Progress_Label, 0xf) $Progress_Percent = GUICtrlCreateLabel ("--", 540, 53, 50, 20) GUICtrlSetBkColor ($Progress_Percent, 0xf) $Proress_Running = GUICtrlCreateLabel ("", 5, 332, 320, 20) GUICtrlSetFont ($Proress_Running, 10, 600, 0, "Arial") GUICtrlSetBkColor($Proress_Running, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor ($Proress_Running, 0x804040) GUICtrlSetColor($Proress_Running, 65535) $Counter_Selected = GUICtrlCreateLabel ("", 328, 332, 315, 20) GUICtrlSetFont ($Counter_Selected, 10, 600, 0, "Arial") GUICtrlSetBkColor($Counter_Selected, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor ($Counter_Selected, 0x804040) GUICtrlSetColor($Counter_Selected, 65535) $Cur_Value = GUICtrlCreateLabel ("", 5, 355, 215, 20) GUICtrlSetFont ($Cur_Value, 10, 600, 0, "Arial") GUICtrlSetBkColor($Cur_Value, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor ($Cur_Value, 0x804040) GUICtrlSetColor($Cur_Value, 65535) $Min = GUICtrlCreateLabel ("", 442, 355, 200, 20) GUICtrlSetFont ($Min, 10, 600, 0, "Arial") GUICtrlSetBkColor($Min, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor ($Min, 0x804040) GUICtrlSetColor($Min, 65535) $Max = GUICtrlCreateLabel ("", 224, 355, 215, 20) GUICtrlSetFont ($Max, 10, 600, 0, "Arial") GUICtrlSetBkColor($Max, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor ($Max, 0x804040) GUICtrlSetColor($Max, 65535) $Time_Label= GUICtrlCreateLabel ("--Time--", ($Width / 2) - 24, $Height - 70, 50) GUICtrlSetFont ($Time_Label, 9, 600, 0, "Arial") GUICtrlSetBkColor($Time_Label, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetColor($Time_Label, 0xffff00) $Divider_Label = GUICtrlCreateLabel ("_____________________________________________________________________________________________________________________________", 0, 225) GUICtrlSetBkColor($Divider_Label, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetColor($Divider_Label, 0x8080ff) $Strip_Graph = GUICtrlCreateGraphic(-1, 150, $Width, 180) GUICtrlSetBkColor($Strip_Graph , $GUI_BKCOLOR_TRANSPARENT) DrawBG() While 1 $msg = GUIGetMsg() Dim $xAxis = 650 Dim $Round = 0 $i = 0 Select Case $msg = $GUI_EVENT_CLOSE ExitLoop Case $msg = $GO_Btn GUICtrlSetState ( $Proc_TextBox, $GUI_DISABLE ) GUICtrlSetState ( $Counter_Combo, $GUI_DISABLE ) GUICtrlSetState ( $GO_Btn, $GUI_DISABLE ) If GUICtrlRead($Proc_TextBox, 1) = "" Or GUICtrlRead($Counter_Combo, 1) = "Select Counters" Then MsgBox(0, "Combo Value", "Please enter Counter/Process") Else LabelDraw(" Process : " & GUICtrlRead($Proc_TextBox, 1), 5, 332, 320, 20) LabelDraw(" Counter : " & GUICtrlRead($Counter_Combo, 1), 328, 332, 315, 20) While 1 $Wmic_Cmd = "wmic process where (Name=""" & GUICtrlRead($Proc_TextBox, 1) & """) get " & GUICtrlRead($Counter_Combo, 1) & " /VALUE" Local $foo = Run(@ComSpec & " /c " & $Wmic_Cmd & " ", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) Sleep(1000) Local $line $line = StdoutRead($foo) $Slice = StringInStr($line, "=") $Trim = StringTrimLeft($line, $Slice) $FinalVal = StringLeft(Int($Trim), 2) DrawBG() $yAxis = $FinalVal GUICtrlSetGraphic($Strip_Graph, $GUI_GR_COLOR, 0xffff00) If $Round = 0 Then $Max = $Trim $Min = $Trim GUICtrlSetGraphic($Strip_Graph, $GUI_GR_DOT, $xAxis, (180 - (($yAxis / 100) * 180))) GUICtrlSetGraphic($Strip_Graph, $GUI_GR_MOVE, $xAxis, (180 - (($yAxis / 100) * 180))) LabelDraw(" Current : " & $Trim & " (K)", 5, 355, 215, 20) ; LabelDraw(" Max : " & $Max, 442, 355, 200, 20) ; LabelDraw(" Min : " & $Min, 224, 355, 215, 20) ElseIf $Round <> 0 Then GUICtrlSetGraphic($Strip_Graph, $GUI_GR_DOT, $xAxis, (180 - (($yAxis / 100) * 180))) GUICtrlSetGraphic($Strip_Graph, $GUI_GR_LINE, $xAxis, (180 - (($yAxis / 100) * 180)) ) GUICtrlSetGraphic($Strip_Graph, $GUI_GR_MOVE, $xAxis, (180 - (($yAxis / 100) * 180))) LabelDraw(" Current : " & $Trim & " (K)", 5, 355, 215, 20) ; If $Trim > $Max Then ; LabelDraw(" Max : " & $Trim, 442, 355, 200, 20) ; ElseIf $Trim < $Min Then ; LabelDraw(" Min : " & $Trim, 224, 355, 215, 20) ; EndIf EndIf $Progress_Label = GUICtrlCreateLabel ("", 320, 53, (($yAxis / 100) * 200 + 1), 20) GUICtrlSetBkColor ($Progress_Label, 0xffff00) $Progress_Percent = GUICtrlCreateLabel (" " & $yAxis & "%", 540, 53, 70, 20) GUICtrlSetFont ($Progress_Percent, 10, 600, 0, "Arial") GUICtrlSetBkColor($Progress_Percent, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetColor($Progress_Percent, 0xffff00) If $xAxis < 1 Then $Strip_Graph = $Strip_Graph = GUICtrlCreateGraphic(-1, 150, $Width, 180) GUISetState() $xAxis = 650 $Round = 0 GUICtrlSetGraphic($Strip_Graph, $GUI_GR_MOVE, 670, 0) GUICtrlSetBkColor($Strip_Graph , $GUI_BKCOLOR_TRANSPARENT) EndIf $xAxis = $xAxis - 2 $i = $i + 1 Sleep(250) $Round = $Round + 1 $PrevX = $xAxis $PrevY = (180 - (($yAxis / 100) * 180)) $Progress_Label = GUICtrlCreateLabel ("", 320, 53, 200, 20) GUICtrlSetBkColor ($Progress_Label, 0xf) $Progress_Percent = GUICtrlCreateLabel ("--", 540, 53, 50, 20) GUICtrlSetBkColor ($Progress_Percent, 0xf) Sleep(1000) WEnd EndIf EndSelect WEnd Func DrawBG() GUICtrlSetBkColor($Strip_Graph, 0xf) EndFunc Func ProgressBar($Text, $Left, $Top, $Width , $Height, $Color) $Progress_Label = GUICtrlCreateLabel ("", 320, 53, ($yAxis / 100) * 200, 20) GUICtrlSetBkColor ($Progress_Label, 0xffff00) $Progress_Label = GUICtrlCreateLabel ($Text, $Left, $Top, $Width , $Height, $Color) GUICtrlSetBkColor ($Progress_Label, $Color) EndFunc Func LabelDraw($Text, $Left, $Top, $Width, $Height) $Proress_Running = GUICtrlCreateLabel ($Text, $Left, $Top, $Width, $Height) GUICtrlSetFont ($Proress_Running, 10, 600, 0, "Arial") GUICtrlSetBkColor($Proress_Running, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor ($Proress_Running, 0x804040) GUICtrlSetColor($Proress_Running, 65535) EndFunc Neil Link to comment Share on other sites More sharing options...
PsaltyDS Posted September 15, 2009 Share Posted September 15, 2009 You didn't mention exactly which process is using all this CPU and memory. Is it the AutoIt script, or your spawned instances of WMIC? Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
GAM Posted September 16, 2009 Author Share Posted September 16, 2009 You didn't mention exactly which process is using all this CPU and memory. Is it the AutoIt script, or your spawned instances of WMIC? AutoIT script is taking this high CPU and memory. Neil Link to comment Share on other sites More sharing options...
GAM Posted September 16, 2009 Author Share Posted September 16, 2009 Can somebody jump into this please? its very imp to me. Neil Link to comment Share on other sites More sharing options...
PsaltyDS Posted September 17, 2009 Share Posted September 17, 2009 AutoIT script is taking this high CPU and memory. I instrumented it something like this to see where the time is going: expandcollapse popup#include <Misc.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <GDIPlus.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> #include <GuiButton.au3> #include <Constants.au3> #include <file.au3> #include <FontConstants.au3> ; ------------------------------------------------------- ; For Debug #include <Debug.au3> _DebugSetup(@ScriptName) _DebugOut(_DebugBugReportEnv()) Global $iDebugTime = TimerInit() ; ------------------------------------------------------- Dim $Width = 650 Dim $Height = 380 Dim $Process = "" Dim $list _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": Create process list") $list = ProcessList() For $i = 1 To $list[0][0] $Process = $Process & "|" & StringUpper($list[$i][0]) Next _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": Create GUI") $Main_Wnd = GUICreate("Process Performance", $Width, $Height, -1, -1, -1, $WS_EX_TRANSPARENT) GUICtrlSetBkColor($Main_Wnd, $GUI_BKCOLOR_TRANSPARENT) GUICtrlCreateGroup("Process and Counter", 30, 30, 255, 90) $Proc_TextBox = GUICtrlCreateCombo("Process Name", 50, 55, 150, 20) GUICtrlSetData($Proc_TextBox, $Process, "item3") GUISetState() $Counter_Combo = GUICtrlCreateCombo("Handle", 50, 85, 150, 100) GUICtrlSetData($Counter_Combo, "HandleCount|KernelModeTime|MaximumWorkingSetSize|MinimumWorkingSetSize|OtherOperationCount|" & _ "OtherTransferCount|PageFaults|PageFileUsage|PeakPageFileUsage|PeakVirtualSize|" & _ "PeakWorkingSetSize|PrivatePageCount|QuotaNonPagedPoolUsage|QuotaPagedPoolUsage|" & _ "QuotaPeakNonPagedPoolUsage|QuotaPeakPagedPoolUsage|ReadOperationCount|ReadTransferCount|" & _ "ThreadCount|UserModeTime|VirtualSize|WorkingSetSize|WriteOperationCount|" & _ "WriteTransferCount", "item3") $GO_Btn = GUICtrlCreateButton("Start", 220, 54, 50, 50) GUICtrlCreateGroup("", 300, 30, 325, 90) $Progress_Label = GUICtrlCreateLabel("", 320, 53, 200, 20) GUICtrlSetBkColor($Progress_Label, 0xf) $Progress_Percent = GUICtrlCreateLabel("--", 540, 53, 50, 20) GUICtrlSetBkColor($Progress_Percent, 0xf) $Proress_Running = GUICtrlCreateLabel("", 5, 332, 320, 20) GUICtrlSetFont($Proress_Running, 10, 600, 0, "Arial") GUICtrlSetBkColor($Proress_Running, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor($Proress_Running, 0x804040) GUICtrlSetColor($Proress_Running, 65535) $Counter_Selected = GUICtrlCreateLabel("", 328, 332, 315, 20) GUICtrlSetFont($Counter_Selected, 10, 600, 0, "Arial") GUICtrlSetBkColor($Counter_Selected, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor($Counter_Selected, 0x804040) GUICtrlSetColor($Counter_Selected, 65535) $Cur_Value = GUICtrlCreateLabel("", 5, 355, 215, 20) GUICtrlSetFont($Cur_Value, 10, 600, 0, "Arial") GUICtrlSetBkColor($Cur_Value, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor($Cur_Value, 0x804040) GUICtrlSetColor($Cur_Value, 65535) $Min = GUICtrlCreateLabel("", 442, 355, 200, 20) GUICtrlSetFont($Min, 10, 600, 0, "Arial") GUICtrlSetBkColor($Min, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor($Min, 0x804040) GUICtrlSetColor($Min, 65535) $Max = GUICtrlCreateLabel("", 224, 355, 215, 20) GUICtrlSetFont($Max, 10, 600, 0, "Arial") GUICtrlSetBkColor($Max, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor($Max, 0x804040) GUICtrlSetColor($Max, 65535) $Time_Label = GUICtrlCreateLabel("--Time--", ($Width / 2) - 24, $Height - 70, 50) GUICtrlSetFont($Time_Label, 9, 600, 0, "Arial") GUICtrlSetBkColor($Time_Label, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetColor($Time_Label, 0xffff00) $Divider_Label = GUICtrlCreateLabel("_____________________________________________________________________________________________________________________________", 0, 225) GUICtrlSetBkColor($Divider_Label, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetColor($Divider_Label, 0x8080ff) $Strip_Graph = GUICtrlCreateGraphic(-1, 150, $Width, 180) GUICtrlSetBkColor($Strip_Graph, $GUI_BKCOLOR_TRANSPARENT) DrawBG() _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": Entering main While/WEnd GUI message loop") While 1 $msg = GUIGetMsg() Dim $xAxis = 650 Dim $Round = 0 $i = 0 Select Case $msg = $GUI_EVENT_CLOSE ExitLoop Case $msg = $GO_Btn _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": Case - GO Button") GUICtrlSetState($Proc_TextBox, $GUI_DISABLE) GUICtrlSetState($Counter_Combo, $GUI_DISABLE) GUICtrlSetState($GO_Btn, $GUI_DISABLE) If GUICtrlRead($Proc_TextBox, 1) = "" Or GUICtrlRead($Counter_Combo, 1) = "Select Counters" Then MsgBox(0, "Combo Value", "Please enter Counter/Process") Else LabelDraw(" Process : " & GUICtrlRead($Proc_TextBox, 1), 5, 332, 320, 20) LabelDraw(" Counter : " & GUICtrlRead($Counter_Combo, 1), 328, 332, 315, 20) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": Entering WMIC While/WEnd loop") While 1 $Wmic_Cmd = "wmic process where (Name=""" & GUICtrlRead($Proc_TextBox, 1) & """) get " & GUICtrlRead($Counter_Combo, 1) & " /VALUE" _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": $Wmic_Cmd = " & $Wmic_Cmd) Local $foo = Run(@ComSpec & " /c " & $Wmic_Cmd & " ", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) Sleep(1000) Local $line $line = StdoutRead($foo) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": $line = " & StringStripWS($line, 3)) $Slice = StringInStr($line, "=") $Trim = StringTrimLeft($line, $Slice) $FinalVal = StringLeft(Int($Trim), 2) DrawBG() $yAxis = $FinalVal GUICtrlSetGraphic($Strip_Graph, $GUI_GR_COLOR, 0xffff00) If $Round = 0 Then $Max = $Trim $Min = $Trim GUICtrlSetGraphic($Strip_Graph, $GUI_GR_DOT, $xAxis, (180 - (($yAxis / 100) * 180))) GUICtrlSetGraphic($Strip_Graph, $GUI_GR_MOVE, $xAxis, (180 - (($yAxis / 100) * 180))) LabelDraw(" Current : " & $Trim & " (K)", 5, 355, 215, 20) ; LabelDraw(" Max : " & $Max, 442, 355, 200, 20) ; LabelDraw(" Min : " & $Min, 224, 355, 215, 20) ElseIf $Round <> 0 Then GUICtrlSetGraphic($Strip_Graph, $GUI_GR_DOT, $xAxis, (180 - (($yAxis / 100) * 180))) GUICtrlSetGraphic($Strip_Graph, $GUI_GR_LINE, $xAxis, (180 - (($yAxis / 100) * 180))) GUICtrlSetGraphic($Strip_Graph, $GUI_GR_MOVE, $xAxis, (180 - (($yAxis / 100) * 180))) LabelDraw(" Current : " & $Trim & " (K)", 5, 355, 215, 20) ; If $Trim > $Max Then ; LabelDraw(" Max : " & $Trim, 442, 355, 200, 20) ; ElseIf $Trim < $Min Then ; LabelDraw(" Min : " & $Trim, 224, 355, 215, 20) ; EndIf EndIf $Progress_Label = GUICtrlCreateLabel("", 320, 53, (($yAxis / 100) * 200 + 1), 20) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": $Progress_Label = " & $Progress_Label) GUICtrlSetBkColor($Progress_Label, 0xffff00) $Progress_Percent = GUICtrlCreateLabel(" " & $yAxis & "%", 540, 53, 70, 20) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": $Progress_Percent = " & $Progress_Percent) GUICtrlSetFont($Progress_Percent, 10, 600, 0, "Arial") GUICtrlSetBkColor($Progress_Percent, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetColor($Progress_Percent, 0xffff00) If $xAxis < 1 Then $Strip_Graph = $Strip_Graph = GUICtrlCreateGraphic(-1, 150, $Width, 180) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": $Strip_Graph = " & $Strip_Graph) GUISetState() $xAxis = 650 $Round = 0 GUICtrlSetGraphic($Strip_Graph, $GUI_GR_MOVE, 670, 0) GUICtrlSetBkColor($Strip_Graph, $GUI_BKCOLOR_TRANSPARENT) EndIf $xAxis = $xAxis - 2 $i = $i + 1 Sleep(250) $Round = $Round + 1 $PrevX = $xAxis $PrevY = (180 - (($yAxis / 100) * 180)) $Progress_Label = GUICtrlCreateLabel("", 320, 53, 200, 20) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": $Progress_Label = " & $Progress_Label) GUICtrlSetBkColor($Progress_Label, 0xf) $Progress_Percent = GUICtrlCreateLabel("--", 540, 53, 50, 20) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": $Progress_Percent = " & $Progress_Percent) GUICtrlSetBkColor($Progress_Percent, 0xf) Sleep(1000) WEnd EndIf EndSelect WEnd Func DrawBG() GUICtrlSetBkColor($Strip_Graph, 0xf) EndFunc ;==>DrawBG Func ProgressBar($Text, $Left, $Top, $Width, $Height, $Color) $Progress_Label = GUICtrlCreateLabel("", 320, 53, ($yAxis / 100) * 200, 20) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": ProgressBar(): $Progress_Label = " & $Progress_Label) GUICtrlSetBkColor($Progress_Label, 0xffff00) $Progress_Label = GUICtrlCreateLabel($Text, $Left, $Top, $Width, $Height, $Color) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": ProgressBar(): $Progress_Label = " & $Progress_Label) GUICtrlSetBkColor($Progress_Label, $Color) EndFunc ;==>ProgressBar Func LabelDraw($Text, $Left, $Top, $Width, $Height) $Proress_Running = GUICtrlCreateLabel($Text, $Left, $Top, $Width, $Height) _DebugOut(Round(TimerDiff($iDebugTime) / 1000, 3) & ": LabelDraw(): $Proress_Running = " & $Proress_Running) GUICtrlSetFont($Proress_Running, 10, 600, 0, "Arial") GUICtrlSetBkColor($Proress_Running, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetBkColor($Proress_Running, 0x804040) GUICtrlSetColor($Proress_Running, 65535) EndFunc ;==>LabelDraw Instead, what I noticed is that you create well over 100 controls per minute, and don't seem to delete any of them. Why do you keep creating label controls over and over instead of just updating the text, or color, or whatever? Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now