บันทึกเรื่องราว สืบสาวความจริง ทิ้งไว้ให้ลูกหลาน.
Save the stories. Investigate the truth. Give to the next generation.


03 กันยายน 2555

<<< แจกโปรแกรม Get Server Time >>>


  • ถูกใจ Au Thipavalai

    • Maha Arai รู้สึกเวียนหัวต้องมานั่งอัพเดพวันที่ทุกวัน เนื่องจากคอมมือสองที่เราไปซื้อมาถูกๆ แบตมันหมด แล้วจะไปเปลี่ยนพวกเคี่ยวคิดเกือบ 1,000 หรือ 500 บาทขึ้น อาจเป็นเพราะ notebook บางรุ่นมันแกะยาก แกะไม่ดีพังชิ้นส่วนแตกหักเพราะเราเคยแกะมาทีหนึ่งแล้ว ก็เลยมาเขียนโปรแกรมอัพเดตง่ายๆ แค่รันโปรแกรมที่เขียนหลังต่อสายแลนก็จบง่ายๆ

    • Maha Arai สำหรับตัวโปรแกรมมี 2 ไฟล์เล็กๆ ที่แยกเป็น 2 ไฟล์เพราะฟังก์ชั่นของ VBS มันง่ายกว่าทำใน Batch files ก็จะแยกเป็น 2 ไฟล์ดังนี้

    • Maha Arai ไฟล์ ชื่อ get_server_time.bat ให้ copy source code ด้านล่างนี้ไปแปะใน notepad แล้ว save เป็นชื่อ get_server_time.bat หรืออะไรก็ได้ที่นามสกุล .bat

      net use p: \\LANPATH /persistent:no 1>NUL 2>NUL
      del p:\tmp\date.txt
      date /T > p:\tmp\date.txt
      cscript //nologo getdate.vbs p:\tmp\date.txt

    • Redrabbit Nada ขยันคิดขยันทำจังเนอะ ดีๆๆๆ

    • Maha Arai โดย LANPATH ให้เปลี่ยนให้ตรงกับเครื่องที่เราเชื่อมต่อโดยปกติมันจะอยู่ในรูปแบบ
      \\ชื่อเครื่องที่เราจะเชื่อมต่อ\พาธ
      หรือจะดัดแปลงส่วนนี้เป็น Drive F: ก็ได้

    • Maha Arai หลักการทำงาน

      net use p: \\LANPATH /persistent:no 1>NUL 2>NUL
      เป็นคำสั่ง Map drive p:

      del p:\tmp\date.txt
      เป็นคำสั่งลบไฟล์เก่า ที่อยู่ใน Drive ราก tmp ชื่อไฟล์ date.txt จะตั้งเป็นรากอะไรชื่อไฟล์อะไรก็ได้

      date /T > p:\tmp\date.txt
      เป็นคำสั่งหลอกๆ เพื่อสร้างไฟล์ date.txt ขึ้นมา เป็นการนำวันที่ในเครื่องไปเขียนไฟล์ใหม่เพื่อนำวันที่สร้างไฟล์ใหม่มาใช้

      cscript //nologo getdate.vbs p:\tmp\date.txt
      เป็นการเรียกใช้งานโปรแกรม getdate.vbs ที่เป็น vb script ซึ่งsource code จะอยู่ด้านล่างนี้

    • Maha Arai copy ข้อความด้านล่างไปแปะใน notepad และตั้งชื่อว่า getdate.vbs จะตั้งเป็นชื่ออื่นก็ได้แต่ต้องไปเปลี่ยนชื่อให้ตรงกับโปรแกรมที่เรียกมาจากโปรแกรมแรก

      Dim objFS, objArgs, strFile, dt , sh

      Set objFS=CreateObject("Script
      ing.FileSystemObject")
      Set objArgs = WScript.Arguments
      strFile = objArgs(0)
      dt = objFS.GetFile(strFile).Dat
      eLastModified

      Set sh = CreateObject("Wscript.shel
      l")

      if (mid(dt,2,1)="/") then

         if (mid(dt,3,2)="10") or (mid(dt,3,2)="11") or (mid(dt,3,2)="12") then
            sh.run "cmd /
      K date " & mid(dt,3,2) & "-" & mid(dt,1,1) & "-" & CStr(Clng(mid(dt,6,4))-543) & " & exit"
            sh.run "cmd /K time " & mid(CStr(dt),11,8) & " & exit"
          else
            sh.run "cmd /
      K date " & mid(dt,3,1) & "-" & mid(dt,1,1) & "-" & CStr(Clng(mid(dt,5,4))-543) & " & exit"
            sh.run "cmd /K time " & mid(CStr(dt),10,8) & " & exit"
         end if
      else
      if (mid(dt,4,2)="10") or (mid(dt,4,2)="11") or (mid(dt,4,2)="12") then
          sh.run "cmd /
      K date " & mid(dt,4,2) & "-" & mid(dt,1,2) & "-" & CStr(Clng(mid(dt,7,4))-543) & " & exit"
          sh.run "cmd /K time " & mid(CStr(dt),12,8) & " & exit"
      else
          sh.run "cmd /
      K date " & mid(dt,4,1) & "-" & mid(dt,1,2) & "-" & CStr(Clng(mid(dt,6,4))-543) & " & exit"
          sh.run "cmd /K time " & mid(CStr(dt),11,8) & " & exit"
         end if
      end if

    • Maha Arai หลักการทำงานโปรแกรมนี้ก็แบ่งเป็นสองส่วน ส่วนแรก

      Set objFS=CreateObject("Scripting.FileSystemObject")
      Set objArgs = WScript.Arguments
      strFile = objArgs(0)
      dt = objFS.GetFile(strFile).Dat
      eLastModified

      เพื่ออ่านค่าวันที่ที่อัพเดตครั้งสุดท้ายจากไฟล์ที่อยากดู ซึ่งกรณีนี้ก็คือไฟล์ p:\tmp\date.txt ที่อยู่หลังคำสั่ง cscript //nologo getdate.vbs ในโปรแกรมแรกนั่นเอง

    • Maha Arai ส่วนที่สองจะเป็นการนำค่าที่อ่านได้มาแปลงให้ถูกต้องตามรูปแบบวันที่ของเครื่องเป็นการเรียกใช้การทำงานของ Command line มีดังนี้

      Set sh = CreateObject("Wscript.shell")
      sh.run "cmd /K time " & mid(CStr(dt),11,8) & " & exit"


      นำค่าจากตัวแปร dt ที่รับค่าวันที่อัพเดตครั้งสุดท้ายมาเซ็ตใส่ให้ โปรแกรม time โดยที่ต้องใช้ฟังก์ชั่น Mid ตัดข้อความ ตั้งแต่ตำแหน่งที่ 11 ไป 8 ตัวเพราะค่าวันที่อ่านได้มันอยู่ในรูปแบบ วันที่ มาก่อนแล้วตามด้วย เวลาซึ่งเริ่มที่ตำแหน่งที่ 11 นับไปอีก 8 ตัวในรูปแบบ hh:mm:ss

    • Maha Arai ส่วนวันที่ยุ่งเล็กน้อย ต้องแปลงจากค่าที่อ่านได้ คั่นด้วย / และเป็นรูปแบบวันเดือนปี เป็นรูปแบบ เดือนวันปี และคั่นด้วย - แทนคือรูปแบบนี้ mm-dd-yyyy และต้องแปลงเป็นปี ค.ศ. - 543 แปลงตัวหนังสือเป็นตัวเลขลบเสร็จแปลงกลับเป็นตัวหนังสือ และที่เช็คเงื่อนไข = 10 - 12 ก็เพราะว่าเวลามีเดือนเดียวมันอยู่ในรูป 8 แทนที่จะเป็น 08
      if (mid(dt,4,2)="10") or (mid(dt,4,2)="11") or (mid(dt,4,2)="12") then
      sh.run "cmd /
      K date " & mid(dt,4,2) & "-" & mid(dt,1,2) & "-" & CStr(CInt(mid(dt,7,4))-543) & " & exit"
      else
      sh.run "cmd /
      K date " & mid(dt,4,1) & "-" & mid(dt,1,2) & "-" & CStr(CInt(mid(dt,6,4))-543) & " & exit"
      end if

    • Maha Arai อันที่จริงใช้คำสั่ง เข้า command line ด้วยคำสั่ง cmd ที่ run แล้วพิมพ์ date หรือ time เพื่อใส่ค่าเองก็ได้แต่ยุ่งยากรวมทั้งแก้วันเวลาที่มันจะย้อนหลังไปเป็นสิบๆ ปีที่ปฏิทินของ windows ก็ได้ แต่วิธีนี้สะดวกสุดไม่ต้องใส่เวลาเองแค่ต่อสายแลนดับคลิ๊กโปรแกรม change_date.bat ก็จบ ยังสามารถนำวิธีนี้ไปประยุกต์ทำนั่นนี่ได้อีกด้วย

    • Maha Arai จากการทดสอบกับมือถือปรากฏว่าไม่เวิร์กเนื่องจากวันที่ที่สร้างไฟล์เป็นวันที่ของเครื่องคอมที่เชื่อมต่อไม่ใช่วันที่ของมือถือ คล้ายๆ flash drive ทั้งหลายนั่นเอง

    • Maha Arai แต่ประโยชน์ 2 อย่างเท่าที่เรามองเห็นในการนำไปประยุกต์ใช้อย่างแรกเลยคือถ้าแบตเสื่อมก็ไม่จำเป็นต้องไปเปลี่ยน ถ้ามีแลนเหลือสักเครื่องที่แบตดีก็สามารถใช้วิธีนี้ในการอัพเดตวันที่เครื่องที่แบตเสื่อมได้ทั้งหมดไม่ว่าจะมีกี่ร้อยกี่พันเครื่อง

    • Maha Arai อย่างที่สองอันนี้มีประโยชน์มากในวงการ database นั่นคือเวลาเราอัพเดตข้อมูลในโปรแกรมดาต้าเบสเช่น MS Access วันที่อัพเดตจากค่า now() ในเครื่องก็มักเป็นวันที่จากเครื่องที่ส่งไป ไม่ใช่วันที่เครื่อง Server ดังนั้นเวลาอาจเพี้ยนจากที่แต่ละเครื่องอาจตั้งเวลาไม่ตรงกัน สามารถใช้หลักการนี้อัพเดตเรคคอร์ดด้วยเวลาจาก Server ตัวเดียวกันได้ และเป็นเทคนิคที่กินทรัพยากรน้อยกว่าเทคนิคที่ต้องรันโปรแกรมหลอกๆ ไว้ที่ Server เพื่อจะอัพเดตเวลาให้เครื่องลูกที่ร้องขอเวลาไป แบบนี้เวลาใกล้เคียงกับเครื่อง Server มากแตกต่างไม่เกินวินาที สามารถนำลอจิคนี้ไปใช้ได้ ถ้าง่ายหน่อยก็แค่เอาโปรแกรมนี้ไปแล้วบังคับให้ทุกเครื่องเวลาเข้าโปรแกรมก็มาอัพเดตเวลาวันที่ให้ตรงกับ Server ทุกเครื่องก็ไม่ต้องดัดแปลงอะไรมากแค่มาเรียกใช้โปรแกรมนี้ก็จบ

    • Maha Arai เมื่อกี้ไปลองติดตั้งในเครื่องลูกข่ายในที่ทำงาน พบว่าถ้าเป็น Windows XP ไม่มีปัญหา แต่ Windows 2000 มีปัญหาฟังก์ชั่น CInt ไม่ทำงานอาจต้องเปลี่ยนเป็นฟังก์ชั่นแปลงเป็นตัวเลขอย่างอื่นแทน สรุปมันคือ โปรแกรม Get Server Time ดึงเวลาจากเครื่่องแม่มาอัพเดตจะได้เวลาเหมือนๆ กัน
http://www.facebook.com/maha.arai

--------------------------------------------------
FfF