- ปิด Google Sheets : GASWS1
- เมนู Tools > Script Editor…
- เมนู File > New > Script File
ตั้งชื่อ: myscript6 - สร้าง function remainDailQuota() ตามนี้
function remainDailQuota() { // https://developers.google.com/apps-script/guides/services/quotas var emailQuotaRemaining = MailApp.getRemainingDailyQuota(); var emailaddress=Session.getActiveUser().getEmail(); var subject="Email Quota Remaining"; MailApp.sendEmail( emailaddress, subject , "คุณเหลือ Quota การส่งอีเมลอีก " + emailQuotaRemaining + " ฉบับ ในรอบ 24 ชั่วโมง" ); }
- เมนู File > Save หรือ กดปุ่ม Ctrl+s
- เมนู Run > remainDailQuota
Month: May 2015
-
การแสดงผลจำนวน Quota การส่งอีเมลที่ยังเหลืออยู่ในรอบ 24 ชั่วโมง
-
การส่งไฟล์แบบ Top Secret!
- ปิด Google Sheets : GASWS1
- เมนู Tools > Script Editor…
- เมนู File > New > Script File
ตั้งชื่อ: myscript6 - สร้าง function MailMerge4() ตามนี้
function MailMerge4() { var ss = SpreadsheetApp.getActiveSpreadsheet(), SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), TemplateID='1bjpQnJikYMGYNaJQhetpZpkHyjI7iqBqDufprzMSo4k', header = "A1:G1", data="A2:G6", dataRows = SalarySheet.getRange(data).getValues(), headerRow = SalarySheet.getRange(header).getValues(), numColumns = SalarySheet.getRange(header).getNumColumns(), emailaddress= "", subject = "", docUrl = ""; for (var i=0 ; i < dataRows.length ; i++) { emailText=""; subject = "[ลับ] กองคลัง : แจ้งการโอนเงินให้คุณ " + dataRows[i][0] + " " + dataRows[i][1]; var id =DriveApp.getFileById(TemplateID).makeCopy(subject).getId(), doc=DocumentApp.openById(id), docBody=doc.getBody(); for (var j = 0 ; j < numColumns -1 ; j++) { docBody.replaceText('{' + headerRow[0][j] + '}' , dataRows[i][j]); } emailaddress=dataRows[i][2]; doc.addViewer( emailaddress); docUrl=doc.getUrl(); doc.saveAndClose(); var attachment = DocumentApp.openById(id); MailApp.sendEmail( emailaddress, subject , "เปิดอ่านเอกสารลับได้ที่ \n" + docUrl ); try { dataRows[i][numColumns-1] = new Date(); } catch (e) { dataRows[i][numColumns-1] = e.message; } } SalarySheet.getRange(data).setValues(dataRows); }
- เมนู File > Save หรือ กดปุ่ม Ctrl+s
- เมนู Run > MailMerge4
- สร้าง function MailMerge5() ตามนี้
function MailMerge5() { var ss = SpreadsheetApp.getActiveSpreadsheet(), SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), TemplateID='1WzzAwF5cDtQD0kcrLKRdP0ZO6-6MCqc_VXRUxzgq_gI', header = "A1:H1", data="A2:H6", dataRows = SalarySheet.getRange(data).getValues(), headerRow = SalarySheet.getRange(header).getValues(), numColumns = SalarySheet.getRange(header).getNumColumns(), emailaddress= "", subject = "", docUrl = ""; for (var i=0 ; i < dataRows.length ; i++) { emailText=""; subject = "[ลับสุดยอดดดดด] กองคลัง : แจ้งเอกสารลับให้คุณ " + dataRows[i][0] + " " + dataRows[i][1]; var id =DriveApp.getFileById(TemplateID).makeCopy(subject).getId(), doc=DocumentApp.openById(id), docBody=doc.getBody(); for (var j = 0 ; j < numColumns -1 ; j++) { docBody.replaceText('{' + headerRow[0][j] + '}' , dataRows[i][j]); } emailaddress=dataRows[i][2]; doc.addViewer( emailaddress); docUrl=doc.getUrl(); doc.saveAndClose(); var now = new Date(); MailApp.sendEmail( emailaddress, subject , "เปิดอ่านเอกสารลับสุดยอดได้ที่ \n" + docUrl ); try { dataRows[i][numColumns-2] = id; dataRows[i][numColumns-1] = now; } catch (e) { dataRows[i][numColumns-1] = e.message; } } SalarySheet.getRange(data).setValues(dataRows); ScriptApp.newTrigger('destroySecretDocument') .timeBased() .after(2 * 60 * 1000) .create(); }
- สร้าง function destroySecretDocument() ตามนี้
function destroySecretDocument() { var ss = SpreadsheetApp.getActiveSpreadsheet(), SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), DataRange=SalarySheet.getDataRange().getValues(); for(var i=1; i< DataRange.length; i++){ var id=DataRange[i][6]; var emailAddress=DataRange[i][2]; DocumentApp.openById(id).removeEditor(emailAddress); DriveApp.removeFile(DriveApp.getFileById(id)); } }
- เมนู File > Save หรือ กดปุ่ม Ctrl+s
เมนู Run > MailMerge5
-
วิธีกู้ไฟล์ที่ถูก Ransomware จับไปเรียกค่าไถ่
Ransomware หรือ โปรแกรมเรียกค่าไถ่ไฟล์ต่างๆ โดยการเข้ารหัสไฟล์เหล่านั้น ทำให้ไม่สามารถเปิดใช้งานได้อีก นอกจากจะยอมเสียค่าไถ่ให้กับผู้ร้ายด้วยเงินสกุล Bitcoin โปรแกรมเหล่านี้จะมาจากการติดตั้ง หรือถูกหลอกให้ติดตั้ง ผ่านทางเว็บไซต์ “อโคจร” ต่างๆ Software เถื่อน ละเมิดลิขสิทธิ์ทั้งหลาย และที่มีบ่อยมากคือ มาจาก “จดหมายหลอกลวง (Phishing)” ซึ่งทำให้ติดเชื้อได้อย่างง่ายดาย
ข้อมูลเพิ่มเติม
https://www.thaicert.or.th/alerts/user/2015/al2015us001.html
เมื่อติด หรือ โดนเรียกค่าไถ่ เรียกได้ว่า ยากมากหรือแทบเป็นไปไม่ได้ที่จะกู้คืนโดยการ Decrypt หรือถอดรหัสกลับคืน
มีวิธีการเดียวที่ทำได้เลยคือ “กู้คืนจากไฟล์สำรองไว้” บนระบบปฏิบัติการ Microsoft Windows เอง ก็สามารถทำได้ โดยผู้ใช้จะต้อง “ตั้งค่าการสำรองข้อมูล” ไว้ก่อน จึงจะสามารถกู้คืนได้ แต่หากเครื่องคอมพิวเตอร์เครื่องนั้นเสียหาย ก็จะไม่สามารถกู้คืนได้อีกเลย
แต่ยังมีวิธีการ “สำรองและกู้คืน” ที่ง่าย ปลอดภัย และแม้ว่าเครื่องคอมพิวเตอร์จะเสียหายอย่างไร ก็จะสามารถ “กู้คืนข้อมูลได้” นั่นคือการใช้งาน Google Drive ในการสำรองข้อมูล โดยผู้ที่มี Google Account หรือ Gmail สามารถใช้งานได้ทันที โดยมีพื้นที่ให้ 15 GB (รวมกับการเก็บ email) ส่วนผู้ใช้ในมหาวิทยาลัยสงขลานคริทนร์ จะได้ใช้ Google Apps for Education ซึ่งมีพื้นที่ในการจัดเก็บ “Unlimited” หรือไม่มีขีดจำกัดเลยทีเดียว (เบื้องต้นจะเห็นพื้นที่จัดเก็บ 10 TB — 10,000 GB)
Google Drive เป็นพื้นที่จัดเก็บข้อมูลบนก้อนเมฆ หรือ Cloud Storage ผู้ใช้ของ Google Account สามารถเข้าถึงได้ที่ https://drive.google.com เมื่อทำการลงชื่อเข้าใช้งาน (Sign In) แล้วก็จะสามารถมองเห็นข้อมูลบนระบบ สามารถสร้าง Folder และ Upload ไฟล์ขึ้นไปเก็บได้ และสามารถเข้าถึงได้จากทั้ง เครื่องคอมพิวเตอร์ และ Smartphone ได้จากทุกแห่งทั่วโลก ดังภาพที่ 1 (โดยต้องมีระบบ Internet เข้าถึงนะ)
ภาพที่ 1: Google Drive บนระบบ Google Apps for Education ของมหาวิทยาลัยสงขลานครินทร์
ในที่นี้ จะแสดงวิธีการ สร้างโฟล์เดอร์ชื่อว่า “เอกสารสำคัญ” ไว้บน Google Drive เพื่อใช้ในการสำรองไฟล์สำคัญไว้ ขั้นตอนคือ คลิกที่ New > Folder แล้วตั้งชื่อว่า “เอกสารสำคัญ” แล้วคลิกปุ่ม Create ดังภาพที่ 2
ภาพที่ 2: สร้างโฟล์เดอร์ชื่อว่า “เอกสารสำคัญ” ไว้บน Google Drive
ส่วนการทำงานเพื่อ Backup ข้อมูลบนเครื่องคอมพิวเตอร์ไปเก็บไว้บนระบบ Google Drive อัตโนมัติ ทำได้โดยติดตั้งโปรแกรม “Google Drive” บนเครื่องคอมพิวเตอร์ แล้วตั้งค่าให้ Sync ข้อมูลกับโฟลเดอร์ “MyGoogleDrive” ใน My Documents ของเครื่องคอมพิวเตอร์ ดังวิธีการต่อไปนี้
- Google Drive สามารถดาว์นโหลดได้จาก https://www.google.com/drive/download/
- เมื่อติดตั้งเรียบร้อยแล้วให้ลงชื่อเข้าใช้ และคลิก Next ไปเรื่อยๆ ดังภาพที่ 3
ภาพที่ 3: คลิก “ถัดไป” จนถึงหน้าจอสุดท้าย - หน้าจอสุดท้าย คลิก “การตั้งค่าขั้นสูง” ดังภาพที่ 4
ภาพที่ 4: คลิก “การตั้งค่าขั้นสูง” - คลิก “เปลี่ยน” แล้วสร้าง MyGoogleDrive ไว้ใน My Documents ดังภาพที่ 5
ภาพที่ 5: สร้าง MyGoogleDrive ไว้ใน My Documents - ต่อไป เลือก “เลือกเฉพาะโฟล์เดอร์เหล่านี้” แล้ว เอาเฉพาะ “เอกสารสำคัญ” แล้วคลิก “เริ่มการซิงค์” ดังภาพที่ 6
ภาพที่ 5: เลือกเฉพาะ “เอกสารสำคัญ” - สักครู่ระบบก็จะทำการ Sync เมื่อเสร็จสิ้น จะได้ผลดังภาพที่ 6
ภาพที่ 6: Sync “เอกสารสำคัญ” เสร็จแล้ว
ให้นำเอกสารสำคัญต่างๆมาใส่ไว้ใน “เอกสารสำคัญนี้” ระบบก็จะทำการ Sync ขึ้นไปบน Google Drive แล้ว และ การแก้ไขเปลี่ยนแปลงไฟล์ในโฟล์เดอร์นี้ จะถูกสำรองเอาไว้
ต่อไป มาดูกันว่า เมื่อมีการแก้ไขไฟล์เอกสารชื่อ “doc1.docx” ระบบ Google Drive จะสำรองข้อมูลเอาไว้ให้ตลอด และสามารถกู้คืนรุ่นของเอกสารได้ ดังภาพที่ 7
ภาพที่ 7: แสดงเวลากับการแก้ไขข้อความ
สิ่งที่ Google Drive สำรองไว้ให้ สามารถดูได้จากการ คลิกขวาที่ไฟล์นั้นๆ แล้วเลือก “Manage Version” ดังภาพที่ 8
ภาพที่ 8: การเลือก Manage Versions
จากนั้น สามารถหากต้องการย้อนเวลา ไปเอาไฟล์นี้ ขณะที่ยังมีข้อความและรูปภาพ ก็คลิกที่เวลา 14:56 แล้วเลือก Download ออกมาทับไฟล์เดิม หรือ เก็บไว้ที่อื่นบนเครื่องคอมพิวเตอร์ก็ได้ ดังภาพที่ 9
ภาพที่ 9: เลือก Version 2 ที่บันทึกเมื่อเวลา 14:56 แล้ว download ไฟล์ออกมา
ผลที่ได้คือ ไฟล์เดิมที่มีข้อความและภาพ ที่บันทึกเมื่อเวลา 14:56 ดังภาพที่่ 10
ภาพที่ 10: ไฟล์ที่ถูกแก้ไขไปแล้ว ก็สามารถกู้กลับมาได้
ในกรณีที่ไฟล์นี้ ถูก “ลบ” ทิ้ง ไม่ว่าจะโดยตั้งใจ หรือ ถูก Ransomware ลบทิ้งแล้วเหลือไว้แต่ไฟล์ที่เปิดไม่ได้ก็ตาม ดังภาพที่ 11 ก็สามารถกู้กลับมาได้
ภาพที่ 11: ไฟล์ doc1.docx ถูกลบหายไปจาก “เอกสารสำคัญ” บนเครื่องคอมพิวเตอร์แล้ว
การกู้ไฟล์ที่ถูกลบไปแล้ว ต้องทำจากบน Google Drive ผ่านทางเว็บเบราเซอร์ โดยเข้าไปใน “เอกสารสำคัญ” แล้วคลิกตัว i ด้านขวามือบน แล้วคลิกที่คำว่า Activity จะพบว่า มีการลบ หรือจริงๆแล้วคือการย้ายไฟล์ไปลง Bin นั่นเอง ดังภาพที่ 12
ภาพที่ 12: แสดงให้เห็นว่าไฟล์ที่ถูกลบ ไปเก็บอยู่ใน Bin ของ Google Drive
การกู้ไฟล์นี้คืนมา ก็เพียงคลิกที่ชื่อไฟล์ doc1.docx แล้วคลิกรูปแว่นขยาย จากนั้นระบบจะนำไปสู่ Bin หลังจากนั้น ให้คลิกขวาที่ doc1.docx แล้วเลือก Restore ตามภาพที่ 13:
ภาพที่ 13: วิธีการ Restore ไฟล์ doc1.docx
ผลก็คือ ได้ไฟล์ที่ถูกลบทิ้งกลับคืนมา ดังภาพที่ 14
ภาพที่ 14: การกู้ไฟล์เสร็จสมบูรณ์
หวังว่าจะเป็นประโยชน์ครับ
-
การส่ง email ถึงผู้รับตามที่กำหนด พร้อมแนบข้อความ/ไฟล์ที่ต้องการ
- ปิด Google Sheets : GASWS1
- เมนู Tools > Script Editor…
- เมนู File > New > Script File
ตั้งชื่อ: myscript6 - สร้าง function MailMerge3() ตามนี้
function MailMerge3() { var ss = SpreadsheetApp.getActiveSpreadsheet(), SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), TemplateID='1bjpQnJikYMGYNaJQhetpZpkHyjI7iqBqDufprzMSo4k', header = "A1:G1", data="A2:G6", dataRows = SalarySheet.getRange(data).getValues(), headerRow = SalarySheet.getRange(header).getValues(), numColumns = SalarySheet.getRange(header).getNumColumns(), emailText = ""; for (var i=0 ; i < dataRows.length ; i++) { emailText=""; var id =DriveApp.getFileById(TemplateID).makeCopy("กองคลัง : แจ้งการโอนเงินให้คุณ " + dataRows[i][0] + " " + dataRows[i][1]).getId(), doc=DocumentApp.openById(id), docBody=doc.getBody(); for (var j = 0 ; j < numColumns -1 ; j++) { docBody.replaceText('{' + headerRow[0][j] + '}' , dataRows[i][j]); } emailText=docBody.getText(); doc.saveAndClose(); var emailaddress=dataRows[i][2], subject = "กองคลัง : แจ้งการโอนเงินให้คุณ " + dataRows[i][0] + " " + dataRows[i][1], attachment = DocumentApp.openById(id); MailApp.sendEmail( emailaddress, subject , emailText, { attachments: [attachment.getAs(MimeType.PDF)] } ); try { dataRows[i][numColumns-1] = new Date(); } catch (e) { dataRows[i][numColumns-1] = e.message; } } SalarySheet.getRange(data).setValues(dataRows); }
- เมนู File > Save หรือ กดปุ่ม Ctrl+s
- เมนู Run > MailMerge3
-
การสร้างไฟล์ PDF จากข้อความที่ต้องการ
- เปิด Google Sheets : GASWS1
- เมนู Tools > Script Editor…
- เมนู File > New > Script File
ตั้งชื่อ: myscript6 - สร้าง function MailMerge2() ตามนี้
function MailMerge2() { var ss = SpreadsheetApp.getActiveSpreadsheet(), SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), TemplateID='1bjpQnJikYMGYNaJQhetpZpkHyjI7iqBqDufprzMSo4k', header = "A1:G1", data="A2:G6", dataRows = SalarySheet.getRange(data).getValues(), headerRow = SalarySheet.getRange(header).getValues(), numColumns = SalarySheet.getRange(header).getNumColumns(); for (var i=0 ; i < dataRows.length ; i++) { var id =DriveApp.getFileById(TemplateID).makeCopy("กองคลัง : แจ้งการโอนเงินให้คุณ " + dataRows[i][0] + " " + dataRows[i][1]).getId(), doc=DocumentApp.openById(id), docBody=doc.getBody(); for (var j = 0 ; j < numColumns -1 ; j++) { docBody.replaceText('{' + headerRow[0][j] + '}' , dataRows[i][j]); } doc.saveAndClose(); var pdfFile = DriveApp.createFile(doc.getAs(MimeType.PDF)); try { dataRows[i][numColumns-1] = new Date(); } catch (e) { dataRows[i][numColumns-1] = e.message; } } SalarySheet.getRange(data).setValues(dataRows); }
- เมนู File > Save หรือ กดปุ่ม Ctrl+s
- เมนู Run > MailMerge2
-
แทนที่ข้อความ ด้วยค่าใน Google Sheets
- เปิด Google Sheets : GASWS1
- สร้าง Sheet ใหม่ ชื่อ “Salary”
- ใส่ข้อมูล
A1 = “Firstname”
B1=”Lastname”
C1=”Email”
D1=”SalaryDetail”
E1=”Salary”
F1=”TransferDate” - จากนั้น ให้กรอกข้อมูลต่างๆ จำนวน 5 แถว ดังภาพ
- สร้าง Sheet ใหม่ ชื่อ “Template”
- ใส่ข้อมูล
A1: เรียน คุณ{Firstname} {Lastname}
A2: จะมี {SalaryDetail} จำนวน {Salary} บาท โอนให้คุณในวันที่ {TransferDate}
A3: จึงเรียนมาเพื่อทราบ
A4: การเงิน - เมนู Tools > Script Editor…
- เมนู File > New > Script File
ตั้งชื่อ: myscript5
เขียนโค๊ดตามนี้function MailMerge1() { var ss = SpreadsheetApp.getActiveSpreadsheet(), SalarySheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Salary")), TemplateSheet=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Template")), header = "A1:G1", data="A2:G6", template="A1:A4", dataRows = SalarySheet.getRange(data).getValues(), headerRow = SalarySheet.getRange(header).getValues(), numColumns = SalarySheet.getRange(header).getNumColumns(), templateRows= TemplateSheet.getRange(template).getValues(); for (var i=0 ; i < dataRows.length ; i++) { var newText = templateRows[0][0] + "\n" + "\t" + templateRows[1][0] + "\n" + "\t" + templateRows[2][0] + "\n" + templateRows[3][0] + "\n"; for (var j = 0 ; j < numColumns -1 ; j++) { newText = newText.replace('{' + headerRow[0][j] + '}', dataRows[i][j]); } try { dataRows[i][numColumns-1] = new Date(); } catch (e) { dataRows[i][numColumns-1] = e.message; } Logger.log(newText); } SalarySheet.getRange(data).setValues(dataRows); }
- เมนู File > Save หรือ กดปุ่ม Ctrl+s
- เมนู Run > MailMerge1
- ดูผลได้ที่ เมนู View > Logs หรือ กดปุ่ม Ctrl+Enter
-
เทคนิคการอ่านค่าจากเว็บไซต์ที่มีการเปลี่ยนแปลง (ราคาหุ้น) มาเก็บไว้บน Google Sheets
มีโจทย์ว่าต้องการคำนวนค่า Indicator ชื่อ RSI ของกองทุนรวมในต่างประเทศ ซึ่งปิดการซื้อขายเวลา 04:00 ของเวลาในประเทศไทย ทางกองทุนจะประกาศราคา (NAV) ในเวลาประมาณ 09:00 แต่ในการตัดสินใจลงทุน จะต้องพิจารณาค่า RSI ซึ่งกองทุนจะคำนวนและประกาศให้ประมาณ 12:00 ซึ่งบางทีก็หลงลืม และไม่ทันการ
การคำนวนค่า RSI ใช้ค่าการเปลี่ยนแปลงของราคา แบ่งเป็น Gain และ Loss แล้วมาหาค่าเฉลี่ยและเข้าสูตรคำนวน (ไม่ขอกล่าวถึง หากต้องการทราบข้อมูลเพิ่มเติม อ่าน http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:relative_strength_index_rsi)
สรุปคือ หากต้องการทราบค่า RSI ก่อนที่ทางกองทุนจะประกาศให้ ก็ต้องคำนวนเอง โดยจดค่าการเปลี่ยนแปลงของราคาในแต่ละวันซึ่งเป็นงานที่น่าเบื่อ จึงต้องหาวิธีลดภาระ
แนวคิดคือ เว็บไซต์ http://www.bloomberg.com/quote/WGHCEPA:ID ซึ่งจะประกาศราคา NAV ในเวลา 09:00 นั้น หากเปิด HTML ดูจะพบว่าข้อมูลที่ต้องการจะอยู่ในรูปแบบของ
... <meta itemprop="price" content="46.92"> ... <meta itemprop="priceChange" content="0.16"> ... <meta itemprop="priceChangePercent" content="0.34"> ... <meta itemprop="quoteTime" content="2015-05-11T00:59:30-0400">
จากนั้น สร้าง Function ตามนี้
function getWGHCEPA(){ var content=UrlFetchApp.fetch("http://www.bloomberg.com/quote/WGHCEPA:ID"); //'<meta itemprop="priceChange" content="0.16">'; var data = content.getContentText().match(/meta itemprop="(.*)" content="(.*)"/mg ); var id="xxxxxxxxxxxxxxxxxxxx Your file ID xxxxxxxxxxxxxx"; var db=SpreadsheetApp.openById(id); var table=db.setActiveSheet(db.getSheetByName("Data")); var result=[]; for (var i=0; i<data.length; i++){ var temp=data[i].match(/meta itemprop="(.*)" content="(.*)"/); result[temp[1]]=temp[2]; } table.appendRow([result["quoteTime"], result["price"], result["priceChange"], result["priceChangePercent"]]); }
จากนั้น ตั้ง Trigger ให้ทำงานวันละครั้ง เวลาตั้งแต่ 09:00-10:00 เป็นอันเรียบร้อย
ผลที่ได้
-
Dialog cannot open tty-output
dialog บน Oracle Enterprise Linux และ Ubuntu ไม่เหมือนกัน (ทำไมล่ะ…ไม่ทราบครับ)
สร้างสคริปต์ชื่อ file.sh มีข้อความว่า
#!/bin/bash
FILE=$(dialog --ascii-lines --title "Delete a file" --stdout \
--title "Please choose a file to delete" --fselect /tmp/ 14 48)
echo $FILEบน Ubuntu รันได้ผลลัพธ์
แต่บน Oracle Enterprise Linux
ต้องเปลี่ยนสคริปต์มีสองแบบ
แบบแรก
#!/bin/sh
dialog --ascii-lines --title "Delete a file" --stdout \
--title "Please choose a file to delete" --fselect /tmp/ 14 48 2>/tmp/file.tmp
echo $(cat /tmp/file.tmp)แบบที่สอง
#!/bin/bash
FILE=$(dialog --ascii-lines --title "Delete a file" --stdout \
--title "Please choose a file to delete" --fselect /tmp/ 14 48 2>&1>/dev/tty)
echo $FILEผลลัพธ์ของทั้งสองแบบให้ผลเหมือนกันคือ
จบ..วันนี้ห้วนไปหน่อย ขอให้สนุกครับ