ข้อควรระวัง(แปลกๆ)ในการเขียน Code(Javascript) และเกร็ดเล็กเกร็ดน้อย by

31
Dec
0

- Floating Error คิดว่า 0.1+0.2 เท่ากับเท่าไหร่เอ่ย? แล้วคิดว่า 0.1+0.2 == 0.3 เป็น True หรือ False คำตอบคือ False นะจ๊ะ เพราะว่า 0.1+0.2 มันเท่ากับ 0.30000000000000004 น่ะสิ

- typeof(null) เท่ากับอะไรเอ่ย คำตอบคือ typeof(null) = “object” ครับ อารายหว่า null มี type เป็น object

- การกำหนดตัวแปรหลายๆตัวพร้อมกัน
var a=1;
var b=2;
var c=3;

ควรเปลี่ยนเป็น

var a=1,
b=2,
c=3;

- หากต้องการกำหนดค่าเริ่มต้นให้ตัวแปรโดยมีเงื่อนไข
if(v){
var x = v;
} else {
var x =99;
}

ให้เปลี่ยนเป็น

var x = v || 99;

- Optimize Loops โดยการลดการเข้าถึงตัวแปรลึกๆหลายๆครั้งเช่น
var names = ['A', 'B', 'C', 'D'];

for(var i=0;i<names.length;i++){
doSomethingWith(names[i]);
}
เปลี่ยนเป็น
var names = ['A', 'B', 'C', 'D'];

for(var i=0,j=names.length;i<j;i++){
doSomethingWith(names[i]);
}

- array To String ใช้ Join
เช่น
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.join(‘|’); จะได้ Banana|Orange|Apple|Mango|

- ไม่ครวย่อ IF ถึงแม้จะสามารถทำได้ เพราะการย่อเมื่อเวลาผ่านไปเวลานาน มันจะทำให้เราไม่มันใจว่าอันไหนเป็นสิ่งที่ถูกหรือผิด เช่น
if(DoSomething)
x = false;
AddSomething()
ควรเปลี่ยนเป็น
if(DoSomething){
x = false;
}
AddSomething()

- ควรกำหนดตัวแปลไว้นอก Loop เช่น
for(var i=0;i<10;i++){
var j=i;
}
ควรเปลี่ยนเป็น
var j;
for(var i=0;i<10;i++){
j=i;
}

เอาเท่านี้ก่อนนะครับบบบ…

Kanban คืออะไร? ช่วยควบคุม flow งานให้ทีมทำงานได้ดีขึ้นได้อย่างไร? by

27
Dec
0

ตามที่เกริ่นไว้จากบทความเดือนที่แล้ว “การสร้างวัฒนธรรมการทำงานเป็นทีมที่มีประสิทธิภาพ” ซึ่งเป็นการเล่าถึงการสร้างสภาพแวดล้อมของทีมที่น่าทำงานด้วยกันขึ้นมาระหว่างเรากับเพื่อนร่วมงาน ครั้งนี้มาเป็นรูปธรรมเอาไว้ช่วยให้ Process เดินไวขึ้นครับ :) แน่นอนว่าถ้าเราดันไม่กินเส้นกับเพื่อนร่วมงาน หรือมีการเมืองในองค์กร มีการโทษกันไปมา บทความนี้คงจะไม่มีประโยชน์อะไร ต้องไปอ่านบทความที่แล้วให้ดีซะก่อนครับ

Kanban ที่มาเริ่มต้นมาจากระบบการทำงานของ Toyota ซึ่งประสบความสำเร็จอย่างมากจนทำให้สามารถผลิตรถออกมาได้ไวกว่าคู่แข่งทั่วโลกจนครองตลาดไปได้มาก สำหรับวงการ Software ได้ถูก David J. Anderson จับนำมาปรับปรุงให้เข้ากับ Software Development เพื่อการพัฒนา Software ได้อย่างรวดเร็วที่สุดด้วยเช่นกัน และสุดท้ายถูกนำไปเป็นส่วนหนึ่งของ Lean Software Development รวมไปถึงถูกจัดให้เป็น Agile อีกแบบหนึ่งนอกเหนือไปจาก Scrum อีกด้วย

Kanban มีกฎอยู่แค่ 3 ข้อ (Scrum มี 9)

  1. Visualize the workflow – แสดง flow การทำงานของระบบให้ออกมาให้เห็นภาพอย่างชัดเจน สามารถบอกได้ว่าขณะนี้งานไปติดขัดที่จุดไหน อย่างไรให้ชัดเจน
  2. Limit Work In Progress (WIP) – จุดหลักของ Kanban เลยคือการ limit งานต่อหนึ่งหน่วยย่อย เช่นงานสำหรับ Development ห้ามถือเกิน 2 งานเพื่อป้องกันไม่ให้งาน Overload มากเกินไป และจะทำให้สูญเสียเวลาไปมากกว่าที่ควรจะเป็น
  3. Measure the lead time – วัดผลการทำงานและปรับปรุงให้ดียิ่งขึ้นไปอีก ตรงนี้จะเรียกว่า Cycle time หรือค่าเฉลี่ยที่ Card 1 อันจะอยู่บนบอร์ดตั้งแต่เริ่มต้นไปจนถึงขึ้นบน production จริง

ข้อดีของ Kanban

  1. เหมาะกับการทำงานหลายๆ project พร้อมกันมากกว่า Scrum
  2. เหมาะกับการทำงาน Maintain, Support ระบบแก้ bug ที่โผล่มาแบบปัจจุบันทันด่วนไปพร้อมๆ กับการพัฒนา feature มาก เพราะสามารถเปลี่ยนแปลงได้เกือบตลอดเวลา ไม่ต้องรอให้จบ sprint
  3. เหมาะกับทีมงานที่มี Specialist อยู่ในทีม และต้องการการ share resource จาก specialist คนนี้พร้อมๆ กัน โดยที่ไม่ทำให้ specialist คนนี้มีงาน overload เกินไป
  4. แน่นอน หากเป็นงาน backend, frontend แยกกันและไม่สามารถฝึกให้คนในทีมเขียนได้ทั้งสองอย่างพร้อมๆ กันได้ Kanban จะช่วยตรงจุดนี้ได้ในแง่การจัดการ flow เช่นงาน backend เสร็จแล้ว รอ frontend หยิบไปทำต่อ ในขณะที่ backend ก็ทำงานใหม่หลังจากส่งงานต่อให้ frontend แล้วทันที ทำให้ไม่มีการว่างงานเกิดขึ้น
  5. หากงานใหญ่ไม่สามารถซอยให้เล็กลงได้แล้วจริงๆ ก็ไม่ใช่ปัญหาสำหรับ Kanban เพราะไม่มี sprint เป็นตัวจำกัดอีกแล้ว
  6. เสริมสร้างความช่วยเหลือระหว่างคนในทีม เนื่องจากแค่มองบอร์ดจะรู้ทันทีว่าตอนนี้งานติดอยู่ที่ใครมากที่สุด (เป็น bottleneck ของ flow ในขณะนั้น) เพื่อนร่วมงานที่เหลือก็จะเข้าไปช่วยกัน เพื่อทำให้ bottleneck ของงานหายไปโดยเร็วที่สุด และสุดท้ายจะสามารถทำงานงาน flow ต่อไปได้ ทำให้งานโดยภาพรวมเสร็จสิ้นมากขึ้น
  7. ช่วยแก้ปัญหา “ทำงานโน่นนิด นี่หน่อย เยอะมาก แต่ไม่เสร็จซักกะงาน” ได้เป็นอย่างดี ด้วย WIP

kanbanandscruminfoqversionfinal
ตัวอย่าง Kanban Board

จากรูปจะเห็นว่า Selected มี (2) ต่อท้าย หมายถึงช่องนี้สามารถรับงานได้แค่ 2 งานเท่านั้น ห้ามยัดมามากกว่านี้ ส่วน Develop จะเป้น (3) ก็คือรับทำงานพร้อมกันไม่เกิน 3 งาน ส่วนของ Deploy ว่างอยู่ซึ่งสามารถดึง A (Done แล้ว) ไปทำต่อได้ และ Live! ก็คือขึ้นบน Production สำเร็จนั่นเอง 1 cycle time คือ card 1 ใบที่วิ่งผ่านตั้งแต่ selected ถึง live! ใช้เวลาทั้งหมดเท่าไรนั่นเอง

จริงๆ ยังมีรายละเอียดอีกมาก แต่ไปอ่านเพิ่มเติมได้ที่

http://www.infoq.com/minibooks/kanban-scrum-minibook

ปล. ขอบคุณพี่กรที่มาแบ่งปันเรื่อง Kanban ให้ผมและคนอื่นๆ รู้ครับ :)

ปล 2. Practice ต่างๆ อย่าง TDD, Pair Programming, Code Review, Retrospective, Standup Meeting ก็ยังหยิบมาใช้ได้ แค่ว่าจะไม่ fix ว่าต้องทำเมื่อไหร่ อาจ set ให้มีเฉพาะเวลาที่จำเป็นเท่านั้น ไม่ใช่ว่าห้ามทำ

จัดการ ป๊อกเด้ง by

26
Dec
0

การเปิด event high low
** ไฟล์จัดการอยู่ที่ lib/model/event **
1. php แก้ไฟล์ config/event ‘event_highlow’ เป็น true;
2. รัน node ไฟล์ createHighLowEvent เพื่อเปิด event ทุกนาทีที่กำหนด ตามของเก่า*
3. รัน node ไฟล์ endHighLowEvent เพื่อปิด event ทุกนาทีที่กำหนด ตามของเก่า*
—————————————————————————
mission nickname achievement
ตัวจัดการทั้งหมด อยู่ที่ lib/model/activity
จะมีการเรียกฟังก์ชั่น เพื่อเช็ค อัพเดท mission nickname achievement อยู่ 4 ตัว คือ
updateActivitys //เอาไว้อัพเดท หรือเช็คค่าหลังเล่นจบ ไว้อัพเดทข้อมูล พวก ได้เงิน เสียเงิน ต่างๆ
updateActivitys_emotion//เอาไว้อัพเดท หรือเช็คค่าหลังส่งอีโมติค่อน
updateActivitys_buy//เอาไว้อัพเดท หรือเช็คค่าหลังซื้อของ
updateActivitys_sendMoney//เอาไว้อัพเดท หรือเช็คค่าหลังส่งเงินไห้เพื่อน
updateActivitys_sitroom//เอาไว้อัพเดท หรือเช็คค่าเงินที่เอาไว้เข้าห้อง หลังสร้างห้อง / นั่ง / จอยรูมแบบนั่งด้วย

** บางตัวจะไม่ อัพเดท mission ถ้าจะเพิ่ม mission ไปดูตัวอย่างจาก updateActivitys ได้จะเรียกอัพเดท และส่งnoti จาก updateMissionNoti
—————————————————————————
event ต่างๆ
- config อยู่ที่ lib/config/event
ตัวจัดการ อีเว้น กลาง
– getEventOpen จัดการ ข้อมูล โดยจะส่งข้อมูล อีเว้นที่เปิดอยู่ใน config ออกมาไห้
– getEventPopup เวลาที่คนเล่น กดไอคอนอีเว้น จะเรียก ฟังก์ชั่นนี้เพื่อแสดงรายละเอียด ถ้ามี error เรียก มาแสดงว่าเขายิงตรง

event จะแบ่งเป็น type ต่างๆ ดังนี้
* inroom_bet เป็นอีเว้นที่เล่นครบกำหนด จะมีโอกาสลุ่นได้รางวัลใหญ่
ตัวจัดการอีเว้นนี้คือ
ฟังก์ชั่นที่เกี่ยวข้อง
– getEventReward เอาไว้คำนวณเวลากดรับของรางวัล โดยมันจะแรนดอม เงินให้
* inroom_click เทพเจ้าโชคลาภ
** ถ้าจะเพิ่ม id ต้องไปเพิ่มใน php ด้วย น่ะ ตรง user/god_event_user_get ด้วย โดยเพิ่ม $activity['event_*ไอดีไหม่*_lasttime'] ด้วย
ตัวจัดการอีเว้นนี้คือ
– timeGodBorn จัดการเวลาเกิดของเทพ
– eventGodClick ทำหน้าที่ 2 อย่าง คือเช็ค ว่าถึงเวลาเทพเกิดยัง กับ กดเทพ โดย flash จะยิงมาถามตลอด เวลา ที่เล่นจบ

*** เวลาจะเปิด event ของ inroom_click จะต้องอัพก่อน 1 วัน คือเปิดได้ 1 วันหลังจากที่ อัพ โค๊ด โดยจัดการเปิด code ที่ ตัวแปร
date_start ใน config
—————————————————————————
emotion
แบ่งเป็น 2 ส่วน
ซื้อ อยู่ที่ php
ฟังก์ชั่น controller/emo_shop
– shop_get เปิด shop ขาย
– buy
– emotion_can_use เรียกตอนจะใช้ emo ตอนอยู่ในห้อง
ตอนใช้ จะเรียกเข้าฟังก์ชั่น js
– sendEmotion อยู่ไฟล์ pokdeng.js เป็นตัวจัดการ

—————————————————————————

จัดการ event stage ตอน 2 by

26
Dec
0

จัดการ config event stage
‘name’ => ชื่อ อีเว้น,
‘full_name’ => ชื่อ เต็มเอาไว้ส่งให้ flash,
‘require_lv’=> เลเวลที่สามารถเข้าได้,
‘start_dungeon_id’ => dungeon_id ของแมพแรกของ อีเว้น,
‘multi_hour’ => array(0,4,8,12,16,20) ชั่วโมงเปิดคูน 2,
‘energy_use_per_step’ => energy ที่เสีย ต่อ ช่องว่าง / วาป ,
‘energy_use_per_get_item’ => energy ที่เสีย ต่อ ช่องที่มีไอเอ็มดรอป,
‘energy_use_per_fight’ => energy ที่เสีย ต่อ ช่องที่สู้กับมอนเตอร์,
‘reward_rank_have_group’ => ของรางวัลแต่ละกลุ่มเหมือนกันไหม ไม่ = 1 เหมือน = 0,
‘random_map_end’ => true ถ้าจบชั้นสูงสุดแล้วแมพต่อไปจะ แรนดอมไหม,
‘time_end’ => strtotime(’2014-01-06 13:00:00′) เวลาจบ อีเว้น,
‘image_name’ => ‘event/20131219_winter_castle.png’ รูปปุ่มเข้าอีเว้น,
‘can_capture_mon’ => true สามารถจับมอนเตอร์ได้ป่าว,
‘type’ => ‘stage’ ประเภทของอีเว้น,
config แยกคนออกเป็นกลุ่ม key คือ ช่องเลเวลของผู้เล่น
‘group’ => array(
ผู้เล่นที่มีเลเวล array(
‘group_id’=>1,
‘max_level’=> 20,
‘max_sub_group’=> 7,
‘code_name’ =>’1-20 ‘,
),
ผู้เล่นที่มีเลเวล 21-30
30=>array(
‘group_id’=>2,
‘max_level’=> 30,
‘max_sub_group’=> 5,
‘code_name’ =>’21-30 ‘,
),
ผู้เล่นที่มีเลเวล 31-45
45=>array(
‘group_id’=>3,
‘max_level’=> 45,
‘max_sub_group’=> 3,
‘code_name’ =>’31-45 ‘,
),
ผู้เล่นที่มีเลเวล array(
‘group_id’=>4,
‘max_level’=> 100,
‘max_sub_group’=> 1,
‘code_name’ =>’45+ ‘,
),
),
config สร้างข้อมูลของ ช้น ‘end_less’ โดยจะเอารูปแบบชั้นจาก ดาต้าเบต แต่พวก เลเวลของมอนเตอร์ เงิน exp จะเปลี่ยนตามนี้
‘end_less’ =>array(
‘mon_lv_min’=>80,
‘mon_lv_max’=>90,
‘mon_team’=>6,
‘money_min’=>750,
‘money_max’=>1000,
‘exp_per_fight’=> 275,
‘monster’=>array(
10=>array(“188″,”189″,”190″,”196″,”197″,”198″,”203″,”204″,”205″,”210″,”211″,”212″,”282″),
40=>array(“1096″,”1112″,”287″,”648″,”302″,”648″,”199″,”206″,”213″),
70=>array(“1097″,”1113″,”1782″,”1787″,”1788″,”1789″,”649″,”442″),
95=>array(“1098″,”1114″,”1783″,”1790″,”1791″,”1792″,”1802″),
100=>array(“1802″),
),
),
คะแนนต่างๆ ของอีเว้น
‘add_point’ => array(
//key เป็นดาวของมอนเตอร์
‘fight_monster’=>array(
1 => 10,
2 => 20,
3 => 30,
4 => 90,
5 => 210,
),
‘capture_monster’=>array(
1 => 20,
2 => 32,
3 => 100,
4 => 1000,
5 => 10000,
),
//key เป็นชั้น
‘end_floor’=>array(
30=>300,
60=>500,
100=>1000
),
‘fight_miniboss’=>array(
20=>2500,
40=>2500,
60=>2500
),
‘fight_boss’=>array(
50=>4000,
80=>4500,
100=>5000,
)
),
ของรางวัลที่แจก โดยอันนี้แต่ละกรุ๊ปเหมือนกัน แต่ถ้า ไม่เหมือน จะเป็น อาเร่ย์ซ้อน เข้าไปอีก 1 ชั้นโดยมี key เป็น กรุ๊ป 1-4
‘reward_rank’ => array(
1=>array(
‘rank_image’=>’grand’,
‘rewards’=>array(
array(
‘type’ => ‘monster’,
‘id’ => 1804,
‘count’ => 1
),
array(
‘type’ => ‘inventory’,
‘id’ => 100,
‘count’ => 1
),
array(
‘type’ => ‘ticket_gold’,
‘count’ => 2
),
),
),
10=>array(
‘rank_image’=>’gold’,
‘rewards’=>array(
array(
‘type’ => ‘monster’,
‘id’ => 1803,
‘count’ => 1
),
array(
‘type’ => ‘inventory’,
‘id’ => 100,
‘count’ => 1
),
array(
‘type’ => ‘ticket_gold’,
‘count’ => 1
),
),
),
25=>array(
‘rank_image’=>’silver’,
‘rewards’=>array(
array(
‘type’ => ‘monster’,
‘id’ => 1784,
‘count’ => 1
),
array(
‘type’ => ‘ticket_silver’,
‘count’ => 3
),
),
),
50=>array(
‘rank_image’=>’bronze’,
‘rewards’=>array(
array(
‘type’ => ‘monster’,
‘id’ => 1783,
‘count’ => 1
),
array(
‘type’ => ‘ticket_silver’,
‘count’ => 2
),
),
),
100=>array(
‘rewards’=>array(
array(
‘type’ => ‘ticket_silver’,
‘count’ => 2
),
array(
‘type’ => ‘money’,
‘count’ => 30000
),
),
),
200=>array(
‘rewards’=>array(
array(
‘type’ => ‘ticket_silver’,
‘count’ => 1
),
array(
‘type’ => ‘money’,
‘count’ => 20000
),
),
),
300=>array(
‘rewards’=>array(
array(
‘type’ => ‘inventory’,
‘id’ => 3,
‘count’ => 2
),
array(
‘type’ => ‘money’,
‘count’ => 10000
),
),
),
500=>array(
‘rewards’=>array(
array(
‘type’ => ‘inventory’,
‘id’ => 3,
‘count’ => 1
),
array(
‘type’ => ‘money’,
‘count’ => 5000
),
),
),
),
ของรางวัลเมื่อจบชั้น จะเป็น อาเรย์ โดยมี key เป็น ชั้นที่จะแจก
‘reward_end_floor’ => array(
1=>array(
‘type’ => ‘inventory’,
‘id’ => 2,
‘count’ => 1
),
10=>array(
‘type’ => ‘inventory’,
‘id’ => 3,
‘count’ => 1
),
20=>array(
‘type’ => ‘inventory’,
‘id’ => 3,
‘count’ => 1
),
30=>array(
‘type’ => ‘money’,
‘count’ => 10000
),
40=>array(
‘type’ => ‘inventory’,
‘id’ => 82,
‘count’ => 1
),
50=>array(
‘type’ => ‘ticket_silver’,
‘count’ => 1
),
60=>array(
‘type’ => ‘inventory’,
‘id’ => 3,
‘count’ => 2
),
70=>array(
‘type’ => ‘inventory’,
‘id’ => 3,
‘count’ => 2
),
80=>array(
‘type’ => ‘money’,
‘count’ => 20000
),
90=>array(
‘type’ => ‘inventory’,
‘id’ => 82,
‘count’ => 2
),
100=>array(
‘type’ => ‘ticket_silver’,
‘count’ => 2
),
),

12 principles of animation (7-12) by

23
Dec
0
-

-

กู้เงิน | เศรษฐกิจพอเพียง | สินเชื่อบุคคล | สมัครบัตรกดเงินสด | สินเชื่อ | เงินกู้ด่วน | ยืมเงินทรูมูฟ | เงินด่วนนอกระบบ