อยู่ๆก็รู้สึกว่า เราเป็นคนที่กลัวอดีตหรือนี่…
ถ้าผมกำลังวิ่งหนีอดีต … แล้วผมจะวิ่งไปหาอะไร ไปเจออะไร?ิิิ
กำลังดู Blueberry pie
2:25 am
อยู่ๆก็รู้สึกว่า เราเป็นคนที่กลัวอดีตหรือนี่…
ถ้าผมกำลังวิ่งหนีอดีต … แล้วผมจะวิ่งไปหาอะไร ไปเจออะไร?ิิิ
กำลังดู Blueberry pie
2:25 am
Blog ตอนนี้แบ่งเป็น 2 Part คือ Javascript และ ภาษา C
ตอนแรกกะเขียนตอนเดียวจบแต่มันยาวแหละหนักเลยขอเรียกตอนนี้่ว่าตอนที่ 1 แล้วกัน
เริ่มเลยแล้วกันเนอะ….
##Scopeใน javascript
var scope = "global"
function f() {
alert(scope);
var scope = "local";
alert(scope);
}
จาก code มี alert สองครั้ง ลองเดาหน่อยไม๊ว่า output จะได้อะไรบ้าง?
บางคนอาจจะสงสัยว่าเอ๊ะ ยังไงกันนะ
มันควรจะได้ global แล้ว ค่อย local
สิ แต่ทำไมมันดันได้ undefine และ local
ล่ะ?
ลองดู code javascript ล่าง ซึ่งมันสมมูลกับ code ตัวอย่างข้างบนครับ
function f() {
var scope;
alert(scope);
scope = "local";
alert(scope);
}
ในภาษา javascript ถ้ามีการประกาศตัวแปรไว้ในฟังก์ชั่นไม่ว่าจะประกาศตรงไหนของฟังก์ชั่นแล้วเผอิญใช้ชื่อซ้ำกับตัวแปรที่มีซ้ำกับ scope ที่อยู่นอกกว่า scope นอกจะโดนซ่อนทันที เพราะ javascript จะหาก่อนว่ามีตัวแปรในสโคปนั้นไม๊ แล้วค่อยเอาค่าออกมาใช้ดัง flowchart ข้างล่าง
จบส่วนของ javascript ครับ ใครเคยเขียนภาษาตระกูล C มาคงงงเล็กน้อยว่า อ้าว… ไหงงั้นล่ะ? ถ้าสนใจลองอ่านต่อใน Part ภาษา C ได้ครับ
##Scope ในภาษา C
c code: /* Block 1 */ int c = 3; { int c = 4; } printf (“c :1 = %d \n”, c);
/* Block 2 */
{
printf ("inner c :1.5 = %d \n", c);
c = 8;
int c = 5;
}
printf ("c :2 = %d \n", c);
compile & run $ gcc scope.c ; ./a.out
/* output */
c :1 = 3
inner c :1.5 = 3
c :2 = 8
ใครเคยเขียนภาษา C ก็น่าจะตอบได้อย่างมั่นใจเลยว่า c :1 => 3
ที่ไม่เป็น 4 ก็เพราะการกำหนด int c = 4;
เป็นการสร้างตัวแปรใหม่ ดังนั้นตัวแปร c ที่เกิดขึ้นมาใหม่นั้นจึงมีชีวิตอยู่แค่ใน block { }
จบ block 1 ตัวแปร c (ที่เกิดขึ้นใน block 1) ก็ตายไป
ส่วน inner c :1.5
ได้ 3 ก็เพราะว่า ใช้้ค่า c จาก scope main
ไปก่อน เพราะว่ายังไม่มีการสร้างตัวแปรใหม่
ส่วน c :2 = 8
เป็นเพราะ c ถูก set ตอน scope ยังเป็นของ main อยู่ (ยังไม่เกิดตัวแปรใหม่ใน block) ส่วน int c = 5;
ก็ตายไปหลังจบ Block 2 c :2
จึงได้ค่า 8
มา
จบแล้วครับ เหนื่อยเลยทีเดียว
โชคดีครับ
ปกติแล้วเรามอง && และ | ว่าเป็นตัวดำเนินการทางด้านตรรกะ (logical operator) เอาไว้ตรวจสอบเงื่อนไขก่อนเข้า if/while ว่าจริง หรือ ไม่จริง operator || และ && เป็น Short-circuit operator ภาษา javascript จะ return LastValue ของการประมวลผลมาให้ด้วย |
return ตัวหลัง
ถ้าตัวแรกเป็นจริงเช่น
console.log(true && 'Hello Javascript');
โค้ดข้างบนจะแสดงข้อความข้อความ Hello Javascript
เพราะ ค่าสุดท้ายของการประมวลผลคือ Hello Javascript
return ตัวหลัง
ถ้าตัวแรกเป็น falseเช่น
console.log(false || 'Hello Javascript');
จะได้ Hello Javascript
เพราะค่าสุดท้ายของการประมวลผลคือ Hello Javascript
เหมือนกัน
##ข้อควรระวัง var a = 0; a++; ++a; console.log(false && ++a); console.log(true || ++a); console.log(a); code ข้างต้นจะไม่ทำ ++a เลย เพราะมี Short-circuit evaluation (ค่าสุดท้ายคือ fasle เพราะว่า false AND กับอะไรก็ได้ false เลยไม่ต้องคำนวณต่อ เนี่ยแหละกระบวนการ Short-circuit)
var name = person && person.getName(); code ข้างบน จะเหมือนกับ
if(person) {
var name = person.getName();
}
/* ส่วนใหญ่จะใช้กับการตรวจสอบ object ว่ามีจริงไหม แล้วค่อยดึงค่าออกมาใช้ */
var name = persons_name || "John Doe"; code ข้างบน จะเหมือนกับ
if(persons_name) {
var name = persons_name;
} else {
var name = "John Doe";
}
/* ส่วนใหญ่จะใช้กับการ set ค่า default */
กระบวนการ Short-circuit evaluation มีอยู่ในหลายภาษาซึ่งแต่ละภาษา return ค่าหลังจากประมวลผลต่างกัน
เราจะมา download youtube vdo ด้วยคำสั่ง (command line) กันครับ คำสั่งที่เราจะใช้ก็คือ youtube-dl ซึ่งก็ตรงๆตัว ครับ
youtube-dl is a small command-line program to download videos from YouTube.com
วันนี้ขี้เกียจอธิบายครับ ดูภาพน่าจะเข้าใจเลย source code อยู่ด้านล่างครับ
ผลจากการทำ cache ทำให้เวลาในการเรียกใช้ api getcctvimg เฉลี่ยอยู่ที่ประมาณ 2.53 วินาที [มาจาก 2.58 2.77 2.52 2.28]