All posts by admin

ขอเชิญชวนผู้ที่สนใจ ร่วมถวายปัจจัยในโอกาสทอดกฐิน ที่วัดแหลมไผ่ 22 ตค. 2565

เรื่องมันเริ่มมาแบบนี้ฮะ บัวบาน แว้บกลับบ้านไปเมื่อช่วงเชงเม้ง ปี 2565 และได้มีโอกาสไปเยี่ยมเยียนท่านหลวงพ่อปราโมทย์ รักษาการเจ้าอาวาสวัดแหลมไผ่ (ซึ่งอดีตเคยเป็นเพื่อนบ้านของบัวบาน). วัดแหลมไผ่เป็นวัดที่เก่าพอสมควร อายุเกิน 100 ปีมาแล้ว เดิมชื่อวัดเวฬุวนาราม ตั้งอยู่ที่ตำบลมะลวน อำเภอพุนพิน แขวงเมืองไชยา​ (ปัจจุบันคือจังหวัดสุราษฎร์ธานี). พอบัวบานได้เยี่ยมชมวัด ก็มีความรู้สึกอยากจะช่วยพัฒนาวัดให้สะอาด สะดวกสบาย ปลอดภัย น่าเข้าหา, บัวบานก็เลยขอร่วมเป็นเจ้าภาพทอดกฐินประจำปีนี้ซะเลย.

ศิลาจารึก จุดกำเนิดของวัดแหลมไผ่ ตั้งแต่สมัย พ.ศ.2452

มีพระบรมราชโองการ ประกาศไว้แก่ชนทั้งปวงว่า ที่เขตรพระอุโบสถ
วัดเวฬวนาราม ตำบลมะลวน ท้องที่อำเภอพุนพิน แขวงเมืองไชยา โดยยาว ๑๓ กว้าง ๑๒ วา เจ้าอธิการด้วน กับทายกแลราษฎร ได้ให้กราบบังคมทูลพระกรุณา ขอเปนที่วิสุงคามสีมา พระเจ้าแผ่นดินสยาม ได้ทรงยินดีอนุโมทนาอนุญาตแล้ว โปรดให้กรมการ ปักกำหนดให้ตามประสงค์ ทรงพระราชอุทิศที่นั้นให้เปนที่วิสุงคามสีมา ยกเปนแผนกหนึ่งต่างหากจากพระราชอาณาเขต เปนที่วิเสศสำหรับพระสงฆ์มาแต่จาตุทิศทั้งสี่ ทำสังฆกรรมมีอุโบสถกรรมเปนต้น

พระราชทานดงแดนวันที่ ๒๖ เมษายน รัตนโกสินทร์ศก ๑๒๙ พระพุทธศาสนกาล ๒๔๕๒ พรรษา เปนวันที่ ๑๕๑๔๑​ ในรัชกาลปัตยุบันนี้

ศิลาจารึก ณ ​อุโบสถวัดแหลมไผ่
ภายนอกโบสถ์
ภายในโบสถ์

ทางวัดแหลมไผ่เองก็ยินดีเป็นอย่างยิ่ง เนื่องจากตัววัดเองก็มีความทรุดโทรมลงไปตามกาลเวลา ทั้งพื้นปูนที่เป็นหลุมเป็นบ่อ สีภายนอกและภายในของสิ่งปลูกสร้าง พรมและเฟอนิเจอร์ที่เสื่อมสภาพ. ทางวัดต้องการทั้งแรงกายและปัจจัยทรัพย์สินมาช่วยซ่อมแซมและพัฒนา เพื่อให้วัดกลายเป็นสถานที่ที่ผู้คนสนใจ และอยากเข้ามาใกล้ชิดธรรม.

บัวบานเองก็เพิ่งจะตระหนักได้นี่เอง ว่าการพัฒนาวัด ก็เป็นสิ่งสำคัญมากในการเผยแผ่ศาสนาพุทธ. ใครๆ ก็อยากจะเข้ามาสถานที่ที่สะอาด สงบ มีฟังก์ชันครบครัน มีความพร้อมในด้านต่างๆ เสมอ. ดังนั้น บัวบานจึงตั้งใจจะอาสาหาเงินมาช่วยพัฒนาวัดแหลมไผ่ เพื่อจะได้ดึงดูดพุทธบริษัทเข้ามาเพื่อให้มีโอกาสได้ใกล้ชิดพุทธศาสนา เผื่อโชคดีขึ้นมา อาจจะได้เห็นธรรม.

โครงการทอดกฐิน 2565 และแผนการพัฒนาวัด

หลวงพ่อปราโมทย์ก็ได้ชี้แจงแผนการพัฒนาวัดไว้คร่าวๆ ดังนี้

  • ทำโรงเลี้ยงอาหาร ข้างๆ ศาลาหลัก (ใกล้ๆ เมรุ) เพื่ออำนวยความสะดวกแก่ผู้คนที่ต้องการใช้สถานที่เพื่องานพิธีกรรมต่างๆ
  • ทำโรงครัว เพื่อรองรับงานพิธีกรรม
  • สมทบทุน พัฒนาระบบประปาภายในวัด
  • ติดตั้งเสาไฟและหลอดไฟในจุดสำคัญต่างๆ (ตอนนี้คือมืดมาก บางจุดคือมืดสนิทเลย)

บัวบานจึงขอใช้โอกาสนี้ ประกาศต่อญาติๆ เพื่อนๆ พี่ๆ น้องๆ ทุกๆคน ว่ามีการทอดกฐิน ปี 2565 ของวัดแหลมไผ่ และกระผมขอเป็นตัวแทน รวบรวมปัจจัยไปส่งมอบให้ทางวัดในวันที่ 22 ตุลาคม 2565 นี้.

ขอร่วมอนุโมทนากับทุกท่าน ขอให้ผลบุญในการช่วยทำนุบำรุงศาสนานี้ นำพาสิ่งดีๆมาแก่ชีวิต และเป็นเสบียงในการเดินทางผ่านวัฏฏะ นำพาให้ท่านพ้นจากทุกข์ทั้งสิ้นทั้งปวงเทอญ.

ผู้ใดที่สนใจร่วมบริจาคเงิน สามารถโอนเงินมาได้ที่

ชื่อบัญชี: ปานนวัต จานทอง
ธนาคาร: ttb (ทีเอมบีธนชาต)
เลขที่บัญชี: 667-2-15521-2

ขอความกรุณาให้ท่านที่โอนเงินมา ส่งสลิปให้บัวบานด้วยนะฮะ. จะทาง facebook messenger หรือ LINE หรืออีเมลล์ก็ได้ฮะ.

ซองกฐิน
รายละเอียด
รายชื่อคณะกรรมการ

ปล่อยปลาอะไรดี? แม่น้ำ คลอง บึง

นึกย้อนกลับไปครั้งแรกที่ตั้งใจจะปล่อยปลาด้วยตัวเอง ตอนนั้นไม่ได้ตั้งใจจะได้บุญจากการช่วยชีวิตสัตว์เลย. เราตั้งใจว่าจะปล่อยปลาลงในแหล่งน้ำธรรมชาติเพื่อให้มนุษย์และสัตว์ในบริเวณนั้นได้มีอาหาร ได้มีสมดุลในธรรมชาติ. จำได้ว่าในครั้งแรก, เราเน้นปลาที่ตัวโต เนื้ออร่อย (555) และไม่ทำลายระบบนิเวศ. ซึ่งเราได้เลือกปลา เทโพ เทพา ยี่สกไทย ปลาตะเพียนทอง และลูกปลาช่อน เอาไปปล่อยในบึงข้างๆคอนโด และก็ได้เตรียมอุปกรณ์ตกปลาไว้พร้อมสรรพ แล้วอธิษฐานในใจให้ปลาโตไวๆ แล้วอีกหกเจ็ดเดือนมาเจอกัน. ทว่าผ่านไปไม่ถึงสามเดือน, เหล่านักตกปลาก็แห่กันมาที่บึงนั้นอย่างล้นหลาม และเราเองก็ไม่ว่างลงมาตกปลาด้วย ก็เลยไม่เคยได้ทดลองตกปลาเลย.

ลูกปลาช่อน
ปล่อยตะเพียนทองลงบึงข้างๆคอนโด ใน กทม.

หลังจากนั้น บัวบานก็ได้ปล่อยปลามาเรื่อยๆ ได้มีการสั่งสมความรู้ความเข้าใจเกี่ยวกับการปล่อยปลาที่ถูกต้อง ทั้งจากการอ่านบทความในอินเตอร์เน็ต การโทรถามกรมประมงฯ, ทำให้ตระหนักได้ว่า การปล่อยปลาโดยไม่ไตร่ตรองให้ถี่ถ้วน มุ่งเน้นแต่จะเอาผลบุญ นั้นเป็นการกระทำที่ไร้ความรับผิดชอบ หรือกระทำด้วยอวิชชา ซึ่งมักจะส่งผลให้เกิดทุกข์หรือบาป.

เมื่อมีการนำบุญเข้ามาเกี่ยวข้องกับการปล่อยชีวิตสัตว์ ก็ทำให้เกิดพุทธพาณิชย์ขึ้นตามวัดมา บวกกับความเชื่อแบบอิหยังวะ (อวิชชาล้วนๆ) ยกตัวอย่าง เช่น

  • การปล่อยปลาไหลลงแม่น้ำ จะช่วยให้การเงิน การงาน การศึกษา และการใช้ชีวิตราบรื่น โดยใช้คำว่าไหล มาเป็นจุดขาย เปรียบเปรยเหมือนให้ชีวิตไหลไปได้อย่างราบรื่น ไม่ติดขัด. ในความเป็นจริง ปลาไหลมีโอกาสตายสูงในแม่น้ำใหญ่ หรือคลองที่มีน้ำไหลเชี่ยว ไม่มีตลิ่ง.
  • การปล่อยเต่า จะช่วยให้ชีวิตยืนยาว มีเกราะกำบังสิ่งร้ายๆ เพราะว่าเต่าเป็นสัตว์ที่มีอายุยืน จึงใช้ความอายุยืน มาเป็นจุดขาย เปรียบเปรยเหมือนเป็นการทำให้เรามีชีวิตยืนเหมือนเต่า.
  • การปล่อยหอยขม จะหมายถึงการทิ้งความขมขื่น ความทุกข์โศก เพื่อให้ชีวิตร่มเย็นเป็นสุขมากขึ้นอีกด้วย. ในความเป็นจริง การเทหอยขมลงแม่น้ำเจ้าพระยานี่คือการฆ่าหอยโดยการถ่วงน้ำ.

บัวบานแนะนำว่า อย่าทำเด็ดขาด! นะฮะ. อย่าปล่อยปลาด้วยความโลภในบุญ แต่จงปล่อยปลาด้วยความเข้าใจและจิตใจอนุรักษ์.

สำหรับชาว กทม. และลุ่มน้ำภาคกลาง, ท่านสามารถเลือกปล่อยปลาตามลิสต์ด้านล่างลงแม่น้ำลำคลองได้นะฮะ และควรหาปลาตัวขนาดกลางไปจนถึงใหญ่ ไม่ควรปล่อยลูกปลา เพราะจะตายซะเป็นส่วนใหญ่ (รอดแค่ 10% ไรงี้). ควรระวังเรื่องชื่อพันธุ์ปลา, เพราะปลาบางพันธุ์นั้นอาจจะมีสายพันธุ์ใกล้เคียง ที่มีชื่อคล้ายกันมากๆ แต่มันเป็นสายพันธ์ุเอเลี่ยนที่อันตรายต่อระบบนิเวศ เช่น ปลายี่สกเทศ, ปลาดุกบิ๊กอุย. ถ้านำปลาเอเลี่ยนพวกนี้มาปล่อยในแหล่งน้ำธรรมชาติ จะเป็นการเบียดเบียนปลาท้องถิ่นมากนะฮะ.

สั่งปลาคังไซส์ใหญ่ ตัวละ 2 กิโลกรัมมาปล่อยลงแม่น้ำ
ปล่อยปลาคัง ตัวเท่าขา

ใน กทม. นั้น แม่น้ำลำคลองส่วนใหญ่จะเป็นคลองขุด. ถ้าจะปล่อย ควรปล่อยลงเจ้าพระยาเลย หรือปล่อยลงคลองที่ใหญ่และกว้างขวางหน่อย.

ปล่อยปลาคังขนาดกลาง ที่คลองกุ่ม

โครงการ โปรแกรมเมอร์จิตกุศล

เป้าหมาย

  • สอนให้เด็กและบุคคลทั่วไปได้รู้ว่าการเขียนโปรแกรมเป็นธรรมชาติของจักรวาล
  • สร้างบุคคลากรโปรแกรมเมอร์เพิ่มในไทย เพื่อเพิ่มศักยภาพด้านอุตสาหกรรมซอฟต์แวร์
  • พัฒนามนุษย์ในประเทศไทย เพื่อเพิ่มศักยภาพโดยรวมของประเทศ

กลุ่มเป้าหมาย

  • เด็กกำพร้า จากบ้านเด็กกำพร้าทั่วประเทศ
  • ผู้ต้องขังในเรือนจำ
  • บุคคลทั่วไป

ทรัพยากรณ์ที่ต้องใช้

  • Computer laptop จำนวน 20 เครื่อง ต่อทุกเดือน.
  • หุ่นยนต์ LEGO พร้อมชุด sensor 20 ตัว.
  • ครูผู้สอน
    • ระดับ 1 ใช้ Minecraft code
    • ระดับ 2 ใช้ Blocky
    • ระดับ 3 ใช้หุ่นยนต์ LEGO
    • ระดับ 4 เริ่มฝึกภาษาคอมพิวเตอร์
    • ระดับ 5 เริ่มฝึกสร้าง application ระดับต้น

แผน

  1. ติดต่อศูนย์เด็กกำพร้าหรือเรือนจำ ให้คัดเลือกบุคคลที่มีความสามารถ 20 คน.
  2. จัดการสอนทุกวัน หรือทุกสองวัน. พร้อมเรียนภาษาอังกฤษไปด้วย.
  3. จบบท ให้ทำแบบทดสอบ.
  4. ผู้ที่ผ่านการทดสอบสุดท้าย จะได้รับ laptop ฟรี. และอาจจะได้รับว่าจ้างให้ทำงานเป็นผู้ช่วยสอน.
  5. ผู้ที่ผ่านการทดสอบ จะได้เรียนต่อการเขียนโปรแกรมระดับสูง.
  6. ผู้ที่จบคอร์สเขียนโปรแกรมระดับสูง จะถูกส่งไปฝึกงานกับบริษัท.

Error: No such module was linked electron_common_v8_util

Electron has removed remote module, and move it to electron-userland at @electron/remote. The last version of Spectron need to migrate to @electron/remote but there is an issue when Spectron includes the module.

const path = require('path');
const remoteMain = require('@electron/remote/main');
const WebDriver = require('webdriverio');

The code above is from spectron/lib/application.js. It shows the line of code that includes module from @electron/remote/main

const get_electron_binding_1 = require("../common/get-electron-binding");
const v8Util = get_electron_binding_1.getElectronBinding('v8_util');

The code above is from server.ts in @electron/remote/main/, it calls getElectronBinding('v8_util').

const getElectronBinding = (name) => {
    if (process._linkedBinding) {
        return process._linkedBinding('electron_common_' + name);
    }
    ...
};

The code above is function getElectronBinding that call _linkedBinding. This code will throw an error and the debugging ends here.

Here is the full error message.

Debugger attached.
Waiting for the debugger to disconnect...
internal/bootstrap/loaders.js:128
      mod = bindingObj[module] = getLinkedBinding(module);
                                 ^

Error: No such module was linked: electron_common_v8_util
    at process._linkedBinding (internal/bootstrap/loaders.js:128:34)
    at Object.getElectronBinding (d:\GIT\univeralcontainer\eikon-driver11\eikon-driver\node_modules\@electron\remote\dist\src\common\get-electron-binding.js:6:24)
    at Object.<anonymous> (d:\GIT\univeralcontainer\eikon-driver11\eikon-driver\node_modules\@electron\remote\dist\src\main\server.js:12:39)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Module.require (internal/modules/cjs/loader.js:974:19)
    at require (internal/modules/cjs/helpers.js:93:18)
    at Object.<anonymous> (d:\GIT\univeralcontainer\eikon-driver11\eikon-driver\node_modules\@electron\remote\dist\src\main\index.js:4:16) {
  code: 'ERR_INVALID_MODULE'
}
Error occurs while nodejs is including module remoteMain from require(‘@electron/remote/main’)

How To – Debounce function in Vue Class Component

I want to validate an input textbox. When users enter anything in the textbox, it will validate and show error message according to the result.

I need to use Debounce here to reduce validation rate.

validateText = _.debounce(() => {
    if (
        this.input.passwordConfirmation.length > 0 &&
        this.input.password !== this.input.passwordConfirmation
    ) {
        this.isPasswordSame = false;
    } else {
        this.isPasswordSame = true;
    }
    console.log('Same: ' + this.isPasswordSame);
    console.log('Valid: ' + this.isPasswordValid);
}, 500);

Then I bind this function to onChange.


Finally, I bind the validation result to a div for error message.

Password and confirmed password is not the same

… WTH …. it does not work.

The reason is that Vue does not work well with arrow function () =>.
So we need to make sure that scope of

this.isPasswordSame

is correct.

Let’s make a simple modification like this.
First declare a validator function as methods. Then pass that function to debounce.

validator() {
    if (
        this.input.passwordConfirmation.length > 0 &&
        this.input.password !== this.input.passwordConfirmation
    ) {
        this.isPasswordSame = false;
    } else {
        this.isPasswordSame = true;
    }

    if (this.input.password.length < 8) {
        this.isPasswordValid = false;
    } else {
        this.isPasswordValid = true;
    }
    console.log('Same: ' + this.isPasswordSame);
    console.log('Valid: ' + this.isPasswordValid);
}

validateText = _.debounce(this.validator, 500);

It works !!!

จับผิด WebDriver ด้วย W3C WebDriver standard และ JSONWireProtocol

 

เคยไหม… ที่พยามเช็ค state ของ element โดยใช้ฟังชันเช่น

browser.isEnabled('div.#login-id');

แต่ทว่า… เช็คยังไงก็ได้ true, ทั้งๆที่ตาเรามันฟ้องว่ามัน disabled อยู่เห็นๆ.

หลังจากเสียเวลากับมันสองวันเต็มๆ, ก็ตัดสินใจล้วงลึกเข้าไปที่ chromedriver โดยไม่ผ่าน WebDriverIO.

เครื่องมือและเอกสารที่ใช้

หาได้ตามกูเกิ้ล.

  • WDIO
  • netstat
  • Postman
  • https://www.w3.org/TR/webdriver1/#dfn-find-element
  • https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelementidenabled

ขั้นตอน

  1. เราก็รันเทสของเราไปตามปกติ. จนมันเปิด browser และเปิด app ของเรา.
  2. เราต้องหา sessionID ที่เทสของเราเปิดไว้.​โดยใช้โปรแกรมดังนี้.
    let ssid = '';
    
    await browser.sessions().then((sess) => {
        sess.value.forEach((ses) => {
            ssid = ses.id;
        });
    });
    
    console.log('SessionID : ' + ssid);
  3. เมื่อเราได้ sessionID มา, ให้เราไปหาว่า webdriver ของเราเปิด service ไว้ที่ไหน. สามารถใช้ netstat เพื่อดูว่าเราเปิด port อะไรไว้มั่ง.
    netstat -a | grep "LISTEN"
  4. จากนั้นก็สุ่ม port ไปทีละอัน โดยเปิด URL ใน web browser เลย. ตัวอย่างข้างล่างสุ่ม port หมายเลข 9515.
    http://localhost:9515/wd/hub/session/:sessionId/element/xxx/enabled
    

    ถ้าเจอเข้ากับ chromedriver service, มันจะตอบกลับมาว่า

    {"sessionId":":sessionId","status":6,"value":{"message":"no such session\n  (Driver info: chromedriver=2.29 (8e8216e581c512667203931f81c1a1ead47222e5),platform=Mac OS X 10.14.1 x86_64)"}}
  5. คราวนี้เราเปิด Postman.
  6. เริ่มต้นจากการหา element. ให้ใช้สร้าง POST request.

    1. URL: http://localhost:<port ที่เราได้มาจาก step 3-4>/wd/hub/session/<sessionID ที่เราได้มาจาก step2>/element
    2. Post body ให้ใช้ raw. ส่งข้อมูลเป็น JSON.
      { "using": "css selector", "value": "coral-panel coral-list-item" }
    3. ถ้าเจอ element, มันจะตอบกลับมาเป็น JSON แบบนี้.
      {
       "sessionId": "87edfc2e515dc6c39b469edbb31a4228",
       "status": 0,
       "value": {
           "ELEMENT": "0.8506124488032647-15"
       }
      }
  7. ต่อมาให้เอา ELEMENT ที่ได้จาก Step 6.3 ไปใช้หา state ของมัน. เราต้องสร้าง request GET ใน Postman.
    1. URL: http://localhost:<port ที่เราได้มาจาก step 3-4>/wd/hub/session/<sessionID ที่เราได้มาจาก step2>/element/<ELEMENT ที่ได้จาก step 6.3>/enabledเราจะเห็น state ในรูปแบบ JSON แบบนี้.
      {
       "sessionId": "87edfc2e515dc6c39b469edbb31a4228",
       "status": 0,
       "value": true
      }

 

จะเห็นได้ว่า ChromeDriver มันตอบมาเป็น TRUE!!!  ทั้งๆที่มัน disabled อยู่อย่างถูกต้องตามกฎเกณฑ์. เฮ้อออ บัดซบ.

Computer Programming For Kids

 

 

 

Programming คืออะไร?

มนุษย์ทุกผู้ทุกคนล้วนแล้วแต่เป็น Programmer ตั้งแต่เกิด, เพียงแต่ไม่รู้ตัวเท่านั้น. เราจะปลุกความเป็น Programmer ในตัวคุณออกมาด้วยการเล่นเกมส์สนุกๆ.

 

คุยกับหุ่นยนต์อย่างไรให้รู้เรื่อง?

เปรียบได้ดังการไปยืนคุยกับผู้พิการหูหนวก, เขาไม่สามารถรับฟังข้อมูลเสียงจากเราได้. สิ่งที่เราควรทำคือ เขียนตัวหนังสือหรือใช้ภาษามือเพื่อสื่อสาร.

เช่นเดียวกัน, ถ้าเราอยากสื่อสารกับ Computer หรือหุ่นยนต์, เราต้องรู้ว่า Computer หรือหุ่นยนต์ตัวนั้นสื่อสารด้วยช่องทางใดและใช้ภาษาอะไรบ้าง?

 

ทดลองสื่อสารด้วยภาษาหุ่นยนต์

หุ่นยนต์ก็เหมือนมนุษย์, มีความแตกต่าง มีหลากหลายชาติพันธุ์. เราจะมาทดลองสั่งการหุ่นยนต์ Ozobot ด้วยภาษาของมันกัน.

 

 

พื้นฐาน 3 ข้อแห่ง Computer Programming

คำสั่ง, เงื่อนไข, การทำซ้ำ … พื้นฐานขั้นสุดของ Computer Programming.

 

เขียน Program สั่งการหุ่นยนต์

ทดลองใช้ภาษา Blocky เพื่อสั่งการหุ่นยนต์ให้เดินหลบสิ่งกีดขวาง.

 

สร้างเกมส์ Flappy Bird ในตำนาน

เกมส์ 8 bit ที่เราต้องพาเจ้านกบินลอดช่องแคบ, ที่เคยดังถล่มทลายเนื่องด้วยความยากระดับเทพพระเจ้า. เราจะสร้างเกมส์เล่นกันด้วย Scratch.

 

 

 

ไม่ต้องกลัวลืม Shortcut key อีกต่อไป, มาเพิ่ม Menu ให้ Sublime กันเถ๊อะ

บัวบานใช้ Sublime บ้างในบางโอกาส. และประสบปัญหาอย่างแรง เวลาจะเรียกใช้ plugin แต่จำ shortcut key ไม่ได้! ต้อง google ทุกครั้งไป. น่าเบื่อ!

วันนี้ขอจบปัญหานี้อย่างถาวร ด้วยการเพิ่มเมนูเข้าไปให้ Sublime เลย. จะขอยกตัวอย่าง Plugin  Pretty JSON ซึ่งมีหน้าที่จัดเว้นวรรค เว้นบรรทัด ให้ JSON อ่านง่ายขึ้นนะฮะ.

Install Plugin

  1. กด Preferences > Package Control

  2. เลือก Package Control: Install package
  3. พิมพ์ “Pretty JSON” แล้วกด Enter

หลังจากที่มันลงเสร็จแล้วเราจะเห็น package นั้นบนเครื่องเรา.
Windows: %userprofile%\AppData\Roaming\Sublime Text 3\Packages\Pretty JSON
Mac: /Users/your-user/Library/Application Support/Sublime Text 3/Packages/Pretty JSON

 

Add a Menu

ณ จุดนี้ เราจะเพิ่มเมนู “PrettyPrint” และภายใต้นั้นเราจะใส่ “Pretty JSON” เอาไว้.

  1. เปิดไฟล์ Main.sublime-menu
  2. เพิ่ม object เข้าไปดังบรรทัดที่ 38-48
    [
        {
            "mnemonic": "n",
            "caption": "Preferences",
            "id": "preferences",
            "children": [
                {
                    "mnemonic": "P",
                    "caption": "Package Settings",
                    "id": "package-settings",
                    "children": [
                        {
                            "caption": "Pretty JSON",
                            "children": [
                                {
                                    "caption": "Settings – Default",
                                    "args": {
                                        "file": "${packages}/Pretty JSON/Pretty JSON.sublime-settings"
                                    },
                                    "command": "open_file"
                                },
                                {
                                    "caption": "Settings – User",
                                    "args": {
                                        "file": "${packages}/User/Pretty JSON.sublime-settings"
                                    },
                                    "command": "open_file"
                                },
                                {
                                    "caption": "-"
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "caption": "PrettyPrint",
            "mnemonic": "p",
            "id": "prettyJson",
            "children": [
                {
                    "command": "pretty_json",
                    "caption": "Pretty JSON"
                }
            ]
        }
    ]
    
  3. Save file และ Restart Sublime. จะเห็น Menu โผล่มา พร้อมกดใช้ได้เลยนะฮะ.

Selenium JavaScript Executor (English version)

Javascript Executor in Selenium have a lot of benefits that normal Selenium API cannot provide.

For instance,

  • You want to fetch data from server but it needs an authentication.
  • You want data inside a response of fetch or AJAX (XHR).
  • You want to get value from Javascript such as data from performance API (Navigation Timing, User Timing, etc.)

Continue reading Selenium JavaScript Executor (English version)