วันเสาร์ที่ 26 กรกฎาคม พ.ศ. 2557

การเขียน Batch File เพื่อแสดงผลใน HTML Application ตอน 1

บางครั้ง...การแสดงผลภาษาไทยนั้นทำได้ไม่ค่อยดีใน Console ผมจึงหาวิธีให้แบทต์ไฟล์แสดงผลผ่านภาษา VBScript ภายใน HTML Application ก็ต้องยอมรับว่า...ติดปัญหาตรงที่มันไม่สามารถรับคีย์บอร์ดและรับสถานกาณ์บน CMD ได้ทั้งหมด...แต่ก็สามารถแสดงผลเป็นภาษาไทยได้อย่างที่ตั้งใจ...สามารถสร้าง Log File หรือ Dir /s แบบเรียวทามต์ได้...โดยไม่ติดปัญหาหรือรอการแสดงผลของแบตช์ไฟล์ให้จบ..เสียก่อน...โปรแกรมนี้สามารถ แคปเจอร์หน้าจอขณะทำงาน...
ดูตัวอย่างนะครับ...

คัดลอกคำสั่งไปสร้างเป็น LAN.BAT เพื่อทดสอบ...
@echo off
echo ทดสอบปิงในวงแลน
for /l %%a in (1,1,255) do (
  for /f "tokens=1,2,3,4,*" %%b in ('ping 192.168.1.%%a -n 1') do (
    if "%%b"=="Request" ( echo [ไม่สามารถเรียกได้  ] 192.168.1.%%a )
    if "%%b"=="Reply"   ( if "%%e"=="Destination" echo [ไม่ได้เชื่อมต่อ    ] 192.168.1.%%a)
    if "%%b"=="Reply"   ( if "%%e"=="bytes=32"    echo [เชื่อมต่อได้แล้ว  ] 192.168.1.%%a)
  )
)

ส่วนคำสั่งของ HTML Application ก็สร้างในพาทเดียวกัน...ชื่อ MS_DOS.HTA
<html>
<head>
<title>My HTML Application</title>
 <hta:application
     applicationname="MyHTA"   
     border="thick"
     borderstyle="normal"
     caption="My HTML Application"
     contextmenu="no"
     icon="myicon.ico"
     maximizebutton="no"
     minimizebutton="yes"
     navigable="no"
     scroll="no"
     selection="no"
     showintaskbar="yes"
     singleinstance="yes"
     sysmenu="yes"
     version="1.0"
     windowstate="maximize" >
  <script language="VBScript">
  Sub Window_onLoad()
runMS_DOS
  End Sub   

  Sub runMS_DOS()
    Dim objCap 
Dim objShell
Dim objStdOut
    Set objShell=CreateObject("wscript.shell")
    Set objCap=objShell.Exec("cmd /c " & "LAN.BAT")
    Do Until objCap.Status
      strHtml=objCap.StdOut.ReadLine
      frmData.document.write "<font face=&#34MS Sans Serif&#34 size=2>" & strHtml & "</font><br>"  
      frmData.focus
      Call ForceRefresh()
      frmData.Scrollto 0, 99999999
    Loop
    MsgBox "เสร็จเรียบร้อย" 
  End Sub

  Function ForceRefresh()
    Set oShell = CreateObject("WScript.Shell")
    oShell.Run "cmd /c", 0, True  
  End Function
  sub checkEnter
    With window.event
      if .keycode = 13 then
        runMS_DOS
      Else
        .cancelbubble = false
        .returnvalue = true
      End if
    End With
  End sub

  </script>
 </head>
 <body bgcolor="Black" color="Green">
   <iframe id="frmData" scrolling="Yes" width="100%" height="80%" frameborder="1" style="background: Black;">
   <div id="divTest"></div> 
   </iframe>
 </body>
</html>


ผลการทำงาน...

โปรแกรมจะเลื่อน Scroll ลงไปเรื่อย...จึงทำให้ทราบผลการทำงานของแบตช์ทันที...

โปรแกรมนี้...ขอเสียคือ...การหยุดประมวลผลระหว่าง...ทำงานจะส่งผลให้มันไม่สามารถทำงานได้...จนกว่า...จะมีการเซ็ตค่า Handle ใหม่...(มันไม่สามารถทำงานครั้งที่สอง...ถ้าไม่ล็อกออฟออกไป...ให้มันรีเซ็ต Handle ใหม่อีกครั้ง...)

สีแดงที่ขีดไว้ในคำสั่ง HTA คือการเรียกคำสั่ง Batch file หรือ DOS Command สามรถเปลี่ยนตามใจชอบเพื่อให้โปรแกรมของคุณ แสดงผลได้ในภาษาที่ต้องการ

วันอังคารที่ 22 กรกฎาคม พ.ศ. 2557

รวมสคริปมาเป็นไฟล์ HTML Application


โปรแกรมนี้...เช่นเดิมเหมือนตัวก่อน..ๆ เพียงแต่ตัวนี้...จบ...สร้างเป็นแฟ้ม HTML Application  มันไม่ต้องมีคำถามด้านความปลอดภัยอีกต่อไป...อยากเรียกใช้งานเมื่อไหร่...ที่ไหน...ก็ได้...


โปรแกรมนี้...จบแหละ...ไม่ต้องต้องสร้าง Assembly Application  หรือ Compile ด้วยภาษาอะไรทั้งนั้น...

วันพฤหัสบดีที่ 17 กรกฎาคม พ.ศ. 2557

จาก DOS Batch File มาเป็น HTML Application

ผมมัวแต่หาทางเขียนโปรแกรมบีบอัดข้อมูลให้เสร็จ...(ทำตามความฝัน) แต่ความเป็นจริงคือโลกมันก้าวไปข้างหน้าโดยไม่รอเรา...จาก ปี 1995 ความฝันคือทำโปรแกรมที่บีบอัดเพลง .MP3 ใส่ใน Floppy Disk ให้ได้...แต่ด้วยความรู้ที่มีมาคือมันต้องเป็น .OGG เท่านั้น...หรือ .MID (มิดิ) แต่ยุคนั้นโปรแกรมแปลงไฟล์เหล่านี้ไม่มี...และความรู้และโปรแกรมอันหลากหลายในโลกอินเตอร์เน็ตที่เป็นของเถื่อน...ก็ยังไม่เยอะ...ความบ้าพลัง...คือจะสร้างโปรแกรมที่ "บีบอัดข้อมูลแบบไม่สูญเสีย...ที่ทำซ้ำกระบวนการได้" มันจึงเป็นความบ้าอันยิ่งใหญ่...ที่ตอนนี้ผ่านมา เกือบ "ยี่สิบปี" มันก็ยังไม่สำเร็จ แต่เข้าใกล้ความจริงทุกขณะ
แต่ก็ขอทำใจ...ในวันนี้ว่า... Source ที่จะทดสอบวันนี้...มันจะเป็นเพียงความฝันหรือความบ้าก็ตามแต่...เท่าที่คำนวณใน Excel มันมีความหวังเล็ก...ว่าโลกนี้ข้อมูลทุกอย่างสามารถบีบซ้ำได้...ก็ทำให้อารมณ์ดี...มานั่งเขียนบล็อก...ต่อ...ให้หลายๆ คนอ่านเล่นๆ ....เข้าเรื่อง
แบตช์...ความรู้ที่จะเป็นเพียงอดีตหรือจบลงใน x86 แต่สิ่งหนึ่งที่เป็นสคริปที่ทนทานกว่า...แข็งแรงกว่า...กลับไม่ใช่ Power Shell แต่มันคือ HTML Application เพราะจากที่ศึกษามา Pain text ตัวนี้มีความสามารถที่แสดงผลภาษาไทยอันยอดเยี่ยม...มีความสามรถทางสีสัน...เหลือพรรณา...และที่สำคัญมันยังทำงานได้อยู่แม้จะเป็น x64 หรือ Windows 8 แม้ครั้งหนึ่งในยุค ME มันเป็นคำสั่งที่ไวรัส RedLof อาศัยพืิ้นฐานของ Desktop.ini มาเป็นเครื่องมือแพร่เชื้อ...แต่จากที่เล่นเวปกว่า 1 ชั่วโมง...ดูคำสั่ง HACK สาระพัดเกี่ยวกับ HTML Applicaion หรือเจ้านามสกุล .HTA แปลกแฮะ...มันคือ .HTM ที่มีแท็ก <HTA: เพิ่มเข้ามาและกำหนดคุณสมบัติของหน้าตางและสภาวะแวดล้อม...คลิกเรียกทำงานมันจะทำงานทันที...โดยไม่มีคำถามความปลอดภัยอะไร...ฮ่าฮ่า...สวมรอยง่ายละทีนี้...แต่กว่าจะเก่งขั้นนั้น...ก็โดนเข้าเหมือนกันเพราะคำสั่งของ HTML Application สามารถลิงค์สคริป...ไปยังแฮกเกอร์ได้...ต้องศึกษาดีๆ ครับ...โดนมาแล้ว...เจ้าตัวแปลง Encoding ของเมืองนอก...หน้าตาหรู่อย่างมาก...มี Matirx แสดงเป็นพื้นหลัง...แต่    "แม่ม" ลิงก์ไปยังเวปที่เข้ารหัส...ฮืม...นึกว่าจะได้โค้ดมาฟรีๆ ... แต่ไม่เป็นไร...หาใน Google สักพัก...เราก็เจอสิ่งที่ต้องการ... Matirx.HTA ... ครับงานนี้...ก็เผยแพร่...ผ่านเครดิตเจ้าของเวปกัน....และจากนี้...บล็อกนี้...จะสอนการ เขียน Batch File ควบคู่ VBScirpt และ ทำงานบน HTML Application เป็นภาษาไทยเต็มรูปแบบซะที...ไม่ติดปัญหาด้านภาษาอีกต่อไป...


จากภาพตัวอย่าง...คือคำสั่งที่ลองกทำงานแล้ว...ให้กด Escape เพื่อออกจากโปรแกรม

นี้คือโค้ด
<html>
<head>
<HTA:APPLICATION ID="matrix" APPLICATIONNAME="matrixhta"
WINDOWSTATE="maximize"
BORDER="none"
SCROLL="no">
<title>Matrix 0.1</title>
<style type="text/css">
body{background-color:black; color:DarkSlateGray; font-size:12px;}
div{width:21px; float:left;}
</style>
<script language="vbscript">
Public n, iTimerID, MyTitle, colnum, carset
ReDim M(1,1)
ReDim SpecCar(64)
SpecCar(0)="&permil;"
SpecCar(1)="&fnof;"   : SpecCar(11)="&Omega;"   : SpecCar(21)="&lambda;" : SpecCar(31)="&phi;"
SpecCar(2)="&Gamma;"  : SpecCar(12)="&alpha;"   : SpecCar(22)="&mu;"     : SpecCar(32)="&psi;"
SpecCar(3)="&Delta;"  : SpecCar(13)="&beta;"    : SpecCar(23)="&nu;"     : SpecCar(33)="&omega;"
SpecCar(4)="&Theta;"  : SpecCar(14)="&delta;"   : SpecCar(24)="&xi;"     : SpecCar(34)="&trade;"
SpecCar(5)="&Lambda;" : SpecCar(15)="&epsilon;" : SpecCar(25)="&pi;"     : SpecCar(35)="&larr;"
SpecCar(6)="&Xi;"     : SpecCar(16)="&zeta;"    : SpecCar(26)="&rho;"    : SpecCar(36)="&uarr;"
SpecCar(7)="&Pi;"     : SpecCar(17)="&eta;"     : SpecCar(27)="&sigmaf;" : SpecCar(37)="&rarr;"
SpecCar(8)="&Sigma;"  : SpecCar(19)="&iota;"    : SpecCar(29)="&tau;"    : SpecCar(39)="&harr;"
SpecCar(10)="&Psi;"   : SpecCar(20)="&kappa;"   : SpecCar(30)="&upsilon;": SpecCar(40)="&radic;"
SpecCar(41)="&infin;" : SpecCar(46)="&there4;"  : SpecCar(51)="&ge;"     : SpecCar(56)="&clubs;"
SpecCar(42)="&ang;"   : SpecCar(47)="&asymp;"   : SpecCar(52)="&oplus;"  : SpecCar(57)="&hearts;"
SpecCar(43)="&cap;"   : SpecCar(48)="&ne;"      : SpecCar(53)="&perp;"   : SpecCar(58)="&diams;"
SpecCar(44)="&cup;"   : SpecCar(49)="&equiv;"   : SpecCar(54)="&loz;"    : SpecCar(59)="&OElig;"
SpecCar(45)="&int;"   : SpecCar(50)="&le;"      : SpecCar(55)="&spades;" : SpecCar(60)="&dagger;"
SpecCar(61)="&Dagger;": SpecCar(62)="&euro;"    : SpecCar(63)="&oelig;"  : SpecCar(64)="&Scaron;"

Sub window_onLoad()
n=54
colnum=48
carset=1
ReDim M(colnum,1)
    For i=1 To colnum
    M(i,0) = Int(53*Rnd)
    t=""
 For j=1 To n
 t = t & "&nbsp;<br>"
 Next
    M(i,1) = t
    Next
    iTimerID = window.setInterval("Progress", 10)
End Sub

Sub Progress
    For i=1 To colnum
    l = Split(M(i,1), "<br>") '--- split by each character in the collumn
    cpos = M(i,0)  '--- position of the character to be written on the screen at this time
 If Int(carset)=1 Then
 l(cpos) = "<span style=""color:White"">" & Chr( 32 + Int(223*Rnd) ) & "</span>"
 carset = carset +0.25
 ElseIf Int(carset)=2 Then
 l(cpos) = "<span style=""color:White"">" & SpecCar( Int(64*Rnd) )  & "</span>"
 carset = 1
 End If
          y=-1
      For j = cpos-1 To cpos-11 Step -1
 tempj = j
 If j < 0 Then
       j = UBound(l) +j +1
 End If
       y=y+1
                Select Case y
Case 0 color="GreenYellow"
Case 1 color="LimeGreen"
Case 2 color="LimeGreen"
Case 3 color="LimeGreen"
Case 4 color="ForestGreen"
Case 5 color="ForestGreen"
Case 6 color="Green"
Case 7 color="Green"
Case 8 color="DarkGreen"
Case 9 color="DarkGreen"
Case 10 color="Black"
End Select
       clj = l(j)
If InStr(1, clj, "<span", 1)>0 Then
clj = Left(clj, InStrRev(clj, "<") -1)
clj = Mid(clj, InStr(clj, ">") +1)
End If
If color <> "" Then
l(j) = "<span style=""color:" & color & """>" & clj & "</span>"
Else
l(j) = clj
End If
 j = tempj
 Next
        t = Join(l, "<br>")
        M(i,1) = t  '--- M(i,1) contains the html of the column
        cpos = cpos +1
If cpos > UBound(l) Then
   cpos = 0
End If
        M(i,0) = cpos   '--- M(i,0) contains the number of the character to be written
        id("col" & i).innerHTML = t  '--- Show the result for this the collumn on the screen
    Next
End Sub

Sub checkKey
    Select Case window.event.keycode
    Case 27  Call ExitMatrix '---escape: Quit the program
    End Select
End Sub

Sub ExitMatrix
window.clearInterval(iTimerID)  '---You must always clear the intervals before leaving
window.close
End Sub

Function id(o)
Set id = document.getElementById(o)
End Function

</script>
</head>
<body onKeyDown="checkKey">
<div id="col1"></div><div id="col12"></div><div id="col23"></div><div id="col34"></div>
<div id="col2"></div><div id="col13"></div><div id="col24"></div><div id="col35"></div>
<div id="col3"></div><div id="col14"></div><div id="col25"></div><div id="col36"></div>
<div id="col4"></div><div id="col15"></div><div id="col26"></div><div id="col37"></div>
<div id="col5"></div><div id="col16"></div><div id="col27"></div><div id="col38"></div>
<div id="col6"></div><div id="col17"></div><div id="col28"></div><div id="col39"></div>
<div id="col7"></div><div id="col18"></div><div id="col29"></div><div id="col40"></div>
<div id="col8"></div><div id="col19"></div><div id="col30"></div><div id="col41"></div>
<div id="col9"></div><div id="col20"></div><div id="col31"></div><div id="col42"></div>
<div id="col10"></div><div id="col21"></div><div id="col32"></div><div id="col43"></div>
<div id="col11"></div><div id="col22"></div><div id="col33"></div><div id="col44"></div>
<div id="col45"></div><div id="col46"></div><div id="col47"></div><div id="col48"></div>
</body>
</html>

หวังว่า...จะสนุกกับการเขียนภาษาคอมพิวเตอร์นะครับ...