Uncategorized

Analytic Functions

มีข้อมูลที่ต้อง query นิดหน่อย แต่รู้สึกว่าถ้าเขียน query ธรรมดาๆ มันก็จะซับซ้อนไปนะ ก็เลยคิดว่าเอา analytic function มาใช้ดีกว่า

ยกตัวอย่างเช่น

picture26

ถ้าเราต้องการ i_prod_cd เฉพาะรายการที่มี Enddate ล่าสุด เราจะเขียน query ยังไงดี

select *
from standard_cost
where (i_prod_cd , enddate) in (
    select i_prod_cd , max(enddate) latestdate
    from standard_cost
    group by i_prod_cd
)

ซึ่งมันจะให้ query plan แบบนี้

picture27

ทีนี้เราลองมาใช้ analytic function บ้าง

select *
from (
    select i_prod_cd , std_cost, rank()
    over (partition by i_prod_cd order by enddate desc) rk
    from standard_cost
) x
where rk = 1

 

พอเราเปลี่ยนวิธี query แผนการ query ก็เปลี่ยนไปด้วย

picture28

 

จากแผนการ query จะเห็นได้ว่าแผนการ query ต่างจากเดิมตั้งแต่กระบวนการ sort

ที่น่าสนใจคือ key ที่ใช้ sort ไม่ใช่แค่ enddate แต่เป็น i_prod_cd และ enddate ก่อนที่จะผ่านไปยัง WindowAgg

ปล. โดยรวมแล้ว actual time จะสูงขึ้นกว่าเดิม ก็พิจารณากันดีๆ นะว่าจะใช้อะไรแบบไหนดี

Uncategorized

de-bounce

ตอนนี้พี่ใหม่เจอปัญหาเรื่อง bounce เนื่อจาก ใช้ Raspberry Pi ตรวจจับ Input จาก Switch

ปัจจุบันนี้จับจาก Falling Edge (ขอบสัญญาณขาลง) โดยปกติแล้วสัญญาณจะถูกส่งมาเป็น Pull UP (logic 1 มาโดยตลอด) เมื่อมีการกด Switch สัญญาณจะลงมาเป็น 0 และเมื่อปล่อย switch สัญญาณก็จะกลับไปเป็น 1 อีกครั้ง

แต่ปัญหาก็คือ เจอ bounce (การกระเพื่อมของสัญญาณ) ทั้งตอนกด switch และ ปล่อย switch

ดังนั้นเทนที่เราจะเจอ Falling Edge 1 ครั้งแล้วนับว่ามีการกด switch 1 ครั้ง กลับกลายเป็นว่า ตอนเราปล่อย มันก็มี falling edge (เนื่องจาก bounce) มันก็เลยนับเป็นการกดครั้งที่ 2 เลย ซึ่งไม่ถูก

too-much-debounce-ckt-2

 

นั่งไล่ตามหาเว็บฝรั่ง คือถ้าเป็นสมัยก่อนๆ ก็คงออกแบบวงจรเพื่อกำจัด bounce แต่ว่าใน web board ของ raspberry pi ก็มีคนมาอธิบายว่าเขาจัดการกับ bounce ยังไง

https://www.raspberrypi.org/forums/viewtopic.php?t=134394

เขาบอกว่าถ้าจะออกแบบเป็นวงจรเขาก็ออกแบบวงจรได้อย่างน้อย 3 แบบดังนี้

debounce-ckts

หรือถ้าจะจัดการทาง software ก็ลองแบบนี้

#!/usr/bin/env python2.7

# file: wait_for_edge-detected-both-fix.py
#
# wait_for_edge_detected solution for falling & rising edges (both)
# a falling edge is detected at approx. 1.16V, a rising edge at approx. 1.25V
#
# you can optionally use GPIO.remove_event_detect(Input_Sig)
#
__author__ = 'paulv'

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)

Input_Sig = 23 # any plain GPIO pin
GPIO.setup(Input_Sig, GPIO.IN)

# set up the edge detection
GPIO.add_event_detect(Input_Sig, GPIO.BOTH)


def main():

    try:
        while True:
            pass # your code

            if GPIO.event_detected(Input_Sig):
                # if we're here, an edge was detected
                sleep(0.005) # debounce for 5mSec
                # only show valid edges
                if GPIO.input(Input_Sig) == 1:
                    print "RISING"
                else:
                    print "FALLING"


    except KeyboardInterrupt:
        pass
    finally:
        print "\nRelease the used pin(s)"
        GPIO.cleanup([Input_Sig])


if __name__ == '__main__':
    main()

จะเห็นว่าหลังจากเขา detect event ได้ว่ามีการ ปรับขึ้นลงของสัญญาณ เขาก็สั่งให้ raspberry pi sleep ไป 5ms แล้วค่อย detect logic

ดูแล้วก็น่าจะช่วยได้อยู่ แต่ยังไม่ได้ลองนะฮะ

Uncategorized

MTA กับ Message Trace Field

เมื่อวานมีกล่าวถึง Internet Message Format ไปแล้ว ที่อ้างไปอ่านที่ RFC 2822 แต่ลืมดูไปว่าอันนี้มัน obsolete ไปแล้ว มันมีอันใหม่คือ RFC 5322 ที่ว่าด้วยเรื่อง Internet Message Format เหมือนกันนี่แหล่ะ

วันนี้เราจะมาว่ากันด้วยเรื่องนึงที่อยู่ในนั้นคือ Trace Field

ท้าวความไปที่ปัญหาเรื่องการส่งเมล์ หลายๆ คนอาจจะเข้าใจว่าเมล์เป็นช่องทางที่รวดเร็วและได้รับข้อมูลแน่นอน แต่ในความเป็นจริงแล้วมันไม่ได้เป็นเช่นนั้นเลย

E-mail แต่ละฉบับจะถูกส่งผ่าน MTA แต่ละตัว ซึ่งก็เป็นไปได้ว่า MTA บางตัวจะมีปัญหา จนกระทั่ง drop email ทิ้ง

แม้ว่าใน RFC 5321 ที่เป็น standard ณ ปัจจุบันจะบอกไว้ว่า MTA มีหน้าที่ความรับผิดชอบที่จะต้องส่งเมล์ให้ได้ จะต้องไม่ทิ้ง email ด้วยปัญหาเหลาะแหล่ะต่างๆ นานา

picture22

picture23

แม้ว่าจะตอบ 250 OK ไปแล้ว แต่สุดท้ายก็มีโอกาสที่ MTA จะส่งเมล์ต่อไปไม่ได้อยู่ดี เพราะถ้าโดน attack หรือ spam อยู่ก็ไม่ใ่ช่ปัญหาเหลาะแหล่ะ กระจอกงอกง่อยป่ะหล่ะ

เพราะฉะนั้น ผู้ใช้อีเมล์ทั้งหลายจงจำไว้ว่า การที่คุณกดส่งเมล์ไป ไม่ได้หมายความว่าเมล์นั้นจะไปถึงปลายทางแน่ๆ นะจ๊ะ

แต่ที่จะอธิบายให้ดูวันนี้ไม่ใช่เรื่องปัญหา แต่เป็นวิธีการดูว่า email ที่เราได้มาเนี่ย มันผ่าน MTA ตัวไหนมาบ้าง ซึ่งถ้าดูตาม RFC 5322 เราก็จะเห็นว่ามันจะอยู่ใน Message Header ตัวที่เขียนว่า Received นั่นแหล่ะ ตัวอย่างเช่น

picture20

 

เราจะเห็นว่า บรรทัดนี้ มันบอกว่า  mx.google.com รับเมล์มาจาก smtp2.dtacnetwork.co.th  ของวันที่ 25/Jun/2014  07:23:09 (GMT -7)

Received: from smtp2.dtacnetwork.co.th ([124.40.235.8])
        by mx.google.com with ESMTP id yk1si5468615pbc.41.2014.06.25.07.23.07
        for <example@gmail.com>;
        Wed, 25 Jun 2014 07:23:09 -0700 (PDT)

จากนั้นก็มีการส่งต่อมาที่ 10.70.72.227 อีกที ด้วยเวลาใกล้ๆ กัน

Received: by 10.70.72.227 with SMTP id g3csp221645pdv;
        Wed, 25 Jun 2014 07:23:09 -0700 (PDT)

 

ที่ให้ดู Trace field นี้ก็จะได้เข้าใจว่า Mail กว่าจะมาถึงเรา มันไปผ่าน MTA ตัวไหนมาบ้าง ตัวไหนที่มันส่งต่อมาช้า เราจะได้จัดการแก้ปัญหาหรือหลีกเลี่ยงมันถูกนะจ๊ะ

Uncategorized

Send Mail Transfer Protocol (SMTP)

ย้อนกลับไปคุ้ยเมื่อ 4 ปีที่แล้วเขียน blog นี้ทิ้งไว้ด้วย

Case Study : เขาหาว่าผมส่ง spam ติด blacklist และพูดไม่รู้เรื่อง

วันนี้ที่ทำงานมี 2 ประเด็นเกี่ยวกับการรับ-ส่งเมล์

เรื่องแรก คือเมล์ส่งไปตอนเที่ยงแล้วบ่ายสองกว่าๆ แล้วปลายทางยังไม่ได้รับ
ส่วนเรื่องที่สองคือเมื่อหลายวันก่อน เมล์จากหน่วยงานภายนอกส่งมาตอนบ่ายแต่กว่าจะได้รับนี่เกือบ 6 โมง

ข้ามเรื่องปัญหาไปแต่วันนี้ขอคุยเรื่อง SMTP หน่อย (คือแบบว่าทำเป็นพูดดีไปงั้นแหล่ะ ขี้เกียจ blog เรื่องอื่นอ่ะวันนี้)

1) ภาษาที่ใช้คุยกัน

SMTP มันเป็น Protocol มาตรฐาน ซึ่งแต่เดิมรายละเอียดของมันหาอ่านได้จาก RFC 821 ที่ถูกอธิบายไว้เมื่อหลายสิบปีก่อนนู้น

Model ของ SMTP ก็จะเป็นรูปนี้

f_126_osos_smtp-model_001

แล้วกระบวนการส่งก็จะมีลักษณะเป็นแบบนี้

smtpmail

ซึ่งกระบวนการนี้ถ้าอย่างอ่านรายละเอียดๆ เช่น MAIL FROM เนื่องมันมีรายละเอียดยังไงก็กลับไปอ่าน RFC ได้

picture18

อันนี้ก็เป็นตัวอย่างการใช้งาน

picture19

แล้วจริงๆ แล้วมันก็มี update ล่าสุดใน RFC 5321 ที่กล่าวถึงเรื่อง Extend SMTP

2) รูปแบบของเนื้อหา

ส่วน Email จะมีเนื้อหายังไงนั้นจะอยู่ใน Format หน้าตาตามที่อธิบายไว้ใน RFC2822 ทั้งในส่วนที่เป็น Message Header (Meta data) และส่วนที่เป็น Body ดังตัวอย่างนี้

picture20

3) วิธีการส่งข้อมูล

ทีนี้กระบวนการส่งเมล์จากคนนึงไปอีกคนนึง มันมีวิธีการมากมายเลย ย่อๆ ออกมาก็ได้ประมาณรูปนี้

howemailworks

ซึ่งจะเห็นว่ากว่าเมล์จะผ่านจากเราไปหาปลายทางได้นั้น มันต้องผ่านอะไรอีกเยอะแยะอย่างนี้ก็ได้

emaildiagram

slide_2

เดี๋ยวพรุ่งนี้ค่อยต่อเรื่องปัญหาเนอะ

Uncategorized

Marginal Profit Part 2: เมื่อตัวเลขมันเปลี่ยนไป

ตอนแรกของ Marginal Profit อยู่ตรงนี้ตามไปอ่านก่อนได้ https://mairai.wordpress.com/2017/01/23/marginal-profit/

 

ถ้าในแต่ละเดือนเรามียอดขายเทียบกับ Marginal Profit เอาไว้ เราก็จะเห็นได้ว่าความสามารถในการทำกำไรจากการผลิตและขายของเรายังปกติดีอยู่หรือเปล่า (อย่าลืมนะว่ามันไม่เอา Fixed Cost มาคิดด้วย) ยกตัวอย่างเช่น

picture17

สมมติว่าเราตั้ง Budget ไว้ว่ายอดขายในแต่ละเดือนของเราจะอยู่ที่ 100 ล้าน และเราจะได้ Maginal Profit อยู่ที่ 30 ล้าน (คิดเป็นประมาณ 30%)

ผมขอสมมติอีกข้อว่า Marginal Profit จะมีสมการแบบเชิงเส้น

ถ้าเราดูในเดือนธันวาคม เราจะพบตัวเลขที่ดูแปลกตา จะเห็นว่าแม้ยอดขายเราจะไม่ได้ตามเป้าหมาย ขาดไปประมาณ 2 ล้านบาท แต่จริงๆ แล้ว ถ้าเราทำยอดขายได้ขนาดนี้ เราควรจะมี Marginal Profit อยู่ที่ประมาณ 29.4 ล้านบาท  แต่นี่เรามี Marginal Profit ลดลง นั่นหมายความว่า

โอกาสที่เราจะขายของได้จนได้ Marginal Profit มากพอที่จะครอบคลุม Fixed Cost ก็ยากขึ้น แสดงว่าจุด Break Event Point ก็น่าจะไกลขึ้น (ต้องผลิตแล้วขายของเพิ่มอีกเยอะเลย)

 

สาเหตุที่ทำได้เราได้ Marginal Profit ลดลงก็มีหลายประการ ถ้าเราแยกเป็น 2 หัวข้อหลักๆ คือ

  1. ยอดขาย
  2. ต้นทุนผันแปร

ผมพูดถึงเรื่องต้นทุนผันแปรที่สูงขึ้นละกัน ต้นทุนผันแปรที่เกี่ยวของก็อาจจะเป็น วัตถุดิบ, ค่าน้ำมัน, ค่าแก๊ส, ค่าน้ำ , ค่าไฟ (ค่าใช้จ่ายต่างๆ ที่มันเพิ่มขึ้นหากมีการผลิตเพิ่มขึ้นนั่นแหล่ะ)

เอาหล่ะก็เป็นไปได้ว่าถ้าเป็นโรงงานอุตสาหกรรม ก็อาจเป็นปัญหาเรื่องวัตถุดิบ ค่าใช้จ่ายเรื่องวัตถุดิบสูงขึ้น นั่นหมายความว่า

  • เราซื้อของมาแพงขึ้นไหม (อาจเป็นผลกระทบจาก Exchange Rate)
  • Yield ในการผลิตต่ำลง
  • ของเสียมากขึ้น
  • วัตถุดิบหาย ควบคุม Stock ไม่ดี

ผลจากตัวอย่างข้างต้นจะเห็นได้ว่า เราสูญเสียไปกับเรื่องทีว่านี้อีกประมาณ 29.4 – 23 = 6.4 ล้าน … (เสียไปกับอะไรบ้างน๊า)

 

Uncategorized

ViewBag

วันนี้ได้มีการพูดถึงไอ้เจ้านี่ระหว่างสัมภาษณ์ Developer คนนึง ไอ้เราเองพอไม่ได้ไปคลุกคลีกับ ASP.NET MVC ก็เลยไม่ได้ไปเตะมันเท่าไหร่ แต่เวลาที่ใครๆ พูดถึงเขาก็จะพูดถึง ViewBag กับ ViewData มาด้วย แต่วันนี้เอาแค่ ViewBag กันก่อนนะ

 

เราสามารถใช้ ViewBag กรณีที่ต้องการส่งข้อมูลเล็กๆ น้อยๆ จาก Controller ไปยัง View ได้

viewdata-viewbag-tempdata-session

สำหรับการใช้งาน ViewBag  ตัวมันมีลักษณะเป็น Dynamic Type Properties ของ ControllerBase Class

ลักษณะการใช้งานหน้าตามันก็จะประมาณนี้

viewbag

 

ตัวอย่างลักษณะ Code ทางฝั่ง Controller ข้างล่างนี้ ถ้าเราต้องการแสดงจำนวนนักเรียนที่ view เราสามารถ Coding ทางฝั่ง Controller ได้เป็นแบบนี้

จะสังเกตุว่าเราก็แปะ TotalStudents ไปกับ ViewBag ทื่อๆ อย่างนี้นี่แหล่ะ

picture15

 

ส่วนทางฝั่ง View เราก็เอาค่า TotalStudents จาก ViewBag มาโชว์กันโต้งๆ แบบนี้นี่แหล่ะ
( ตัว @ ใน ASP.NET MVC หมายถึงการเอาค่าตัวแปรจาก server side )picture16

ปล. มันเป็นการส่งค่าทางเดียวจาก Controller ไป View แต่ไม่สามารถ update หรือเปลี่ยนแปลงค่าใดๆ ที่ view แล้วส่งกลับมาที่ controller ได้นะ

สนใจเพิ่มเติม ตามไปอ่านที่นี่ได้

http://www.tutorialsteacher.com/mvc/viewbag-in-asp.net-mvc

Uncategorized

Setting an environment variable before a command in bash

จั่วหัวแบบลอกเขามาเพราะคาใจกับท่าใหม่ที่ไม่เคยเห็นมาก่อนตอนไปเรียน Graphite กับ Grafana

เพราะว่าถ้าลอง set instruction ตามนี้ https://www.digitalocean.com/community/tutorials/how-to-keep-effective-historical-logs-with-graphite-carbon-and-collectd-on-centos-7

เราจะเจอคำสั่งนี้เข้าไปถึงกับงง

picture12

ไอ้เราก็เห้ย ไม่เคยเห็นมาก่อน มันจะ run ได้แน่ใช่มะเนี่ย แล้วมันจะไป execute ตัวไหน แล้ว argument แต่ละอันเป็นอะไรกันแน่ (ใน class มี manual บอกให้ export PYTHONPATH ไปก่อนหน้านี้รอบนึงแล้วด้วย)

ก็เลยเก็บมาหาข้อมูลที่บ้านสักหน่อย ก็ได้คำตอบว่า
http://unix.stackexchange.com/questions/56444/how-do-i-set-an-environment-variable-on-the-command-line-and-have-it-appear-in-c

picture13

คำตอบชัดเจนทีเดียว ถ้าเราต้องการค่าเพื่อไว้ใช้สำหรับ command เดียว ไม่ต้องไป export มันก็ได้ ใช้เป็น inline แบบด้านบนเลย

…..ยัง…ยัง…. ยังไม่จบ

นั่งอ่านเว็บไปก็เจอปัญหาเพิ่มเติมว่า ถ้าเรา pipe ไปที่ commandที่2 แล้วไอ้ตัวแปรนั้นมันไม่ตามไปด้วย

ถ้าจะทำให้ได้แบบนั้นก็ต้องใช้ท่านี้

http://stackoverflow.com/questions/10856129/setting-an-environment-variable-before-a-command-in-bash-not-working-for-second

picture14

 

 

Uncategorized

Linux server’s Performance

ขอเก็บตกจาก Class Graphite กับ Grafana เมื่อวันเสาร์นิดนึง มันมีประเด็นเรื่องที่มีการพูดคุยกันใน Class ว่า เอ … “มี spec เครื่องแนะนำไหมครับ สำหรับ Graphite และ Grafana”

ก็คันปากอยากจะตอบแทนยิกๆ แต่ว่าเห็นคนสอนตอบแล้ว คำตอบที่ได้ก็น่าพอใจ

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

ที่หยิบประเด็นนี้มาเล่าให้ฟังคือบรรดา System Administrator ไม่ค่อยจะใส่ใจรายละเอียดของระบบที่เราดูแลอยู่ จัดการปัญหาแบบขอไปทีทำให้คำตอบบางคำตอบได้ยินแล้วมันขัดหู เช่น ต้องใช้ CPU กี่ Core ต้องเพิ่ม Ram เท่านั้น เท่านี้ โดยที่ไม่ได้ลงไปดูสาเหตุว่ามันมีสาเหตุมาจากอะไรกันแน่

ต้องเพิ่มเครื่องเพราะใช้ TCP Connection เยอะ” แต่จะมีสักที่คนที่ดูว่า

ตอนนี้มันมีกี่ Connection?
แล้วมันอยู่ State อะไรบ้างเท่าไหร่?
parameter  fs.file-max กำหนดไว้เท่าไหร่ (เผลอๆ บางคนไม่รู้ด้วยว่ามันเกี่ยวอะไร)?
แล้วบางคนก็ไม่สนใจว่า port range ใน linux มัน default เริ่มต้นเท่าไหร่?

เราทำงานด้านวิทยาศาสตร์นะ ไม่กำหนดแล้วเก็บรวบรวมข้อมูลที่เกี่ยวข้องกันหน่อยเหรอ

796px-tcp_state_diagram_fixed-svg

 

เอาเป็นว่า งาน Performance Tuning มันยากกว่าการตอบง่ายๆ ว่าควรใช้ CPU กี่ core และ Ram เท่าไหร่ และผมดีใจที่คนสอนก็ไม่ได้ตอบไปแบบนั้น

 

 

 

Uncategorized

ย้ายโดเมน

วันนี้ได้ทำเรื่องที่ไม่เคยทำมาก่อนในชีวิตเลยนั่นคือการย้ายโดเมน ก็เลยลองทำดูสักหน่อยถือว่าจะได้ไม่เสียชาติเกิด

ก่อนอื่นชื่อ admin ของโดเมนจะต้องเป็น email ของเรานะ มันถึงจะทำได้ตลอดรอดฝั่ง

ผมโอนย้ายจากผู้ให้บริการเจ้านึงในไทย ที่เกือบทุกอย่างจะต้องแจ้งเจ้าหน้าที่ทำให้ ไปยัง Dreamhost ที่ดูเหมือนทุกอย่างจะอัตโนมัติ

ขั้นแรก เราจ้องขอ Auth Code จากที่เก่ามาก่อน พร้อมขอให้เค้า Unlock ให้ด้วย ซึ่งกระบวนการนี้เจ้าหน้าที่ทางฝั่งไทยบอกว่าใช้เวลาประมาณ 1 ชั่วโมง โดยให้ผมใช้ email เมล์เข้าไป request

เมื่อผมได้ AUTH CODE มาแล้วก็เอาไปกรอกข้อมูลที่เว็บ dreamhost ว่าขอ register เพื่อ transfer domain มา เราก็กรอก AUTH CODE พร้อมข้อมูลส่วนตัว

picture08

 

ถึงตรงเนี้ย dreamhost ก็บอกว่า ย้ายมาได้นะ แต่ต้องต่ออายุโดเมนกับเขา 1 ปีด้วย อ่ะ ก็หยวนๆ ไป (แต่ค่าต่ออายุแอบแพงอยู่นะ เกือบ 14USD ได้)

หลังจากนั้นก็มี email มาให้อ่านรายละเอียดแล้วเพื่อ Confirm นิดหน่อย

picture09

ทางฝั่งไทยที่เราย้ายออกมาก็มีเมล์มาให้ Confirm เหมือนกัน

picture10

 

ไม่นานก็มีเมล์มายืนยันการ Transfer ว่าเรียบร้อยแล้วจาก dreamhost ก็เป็นอันว่าเรียบร้อย

picture11

รวมแล้วใช้เวลาไม่ถึง 4 ชั่วโมงเลย รวมเวลารอคอย Process ต่างๆ ไปแล้วด้วย

อย่างที่เห็นจาก Information ที่เข้าแจ้งมา ถ้าเรา เพิ่งทำกระบวนการ Transfer เสร็จ เราจะ Transfer ไปไหนไม่ได้อีก 60 วัน

อ้อ โดย default แล้วพอย้ายมา domain จะมีสถานะเป็น Unlock อยู่ ก็เปลี่ยนเป็น Lock ซะหน่อยก็ดี

 

 

Uncategorized

ว่ากันด้วยเรื่อง Marginal Profit

ว่าจะตั้งใจจดเรื่องนี้เป็นเรื่องเป็นราวมาตั้งแต่ 2 ปีที่แล้ว ก็ไม่ได้ทำสักที คราวนี้ก็คงต้องจัดสักหน่อย เพราะมันมีเรื่องราวมหากาพยืดยาวตามมาอีกมาก ซึ่งก่อนจะไปมหากาพเหล่านั้นเราต้องมาทำความเข้าใจไอ้เรื่องนี้ก่อน

ผมข้ามพวก ต้นทุนคงที่ (FC)  ต้นทุนผันแปร (VC) ไปเลยนะ คิดว่าคงเข้าใจกันแล้วหรือหาอ่านกันได้ไม่ยาก

ทีนี้เรามาว่ากันด้วยเรื่อง Marginal Profit กันก่อน

ใน Wiki บอกว่า Marginal Profit คือ ผลต่างของ Marginal Revenue กับ Marginal Cost (แม่มช่วยได้มาก)

ใน Investopedia.com บอกว่า มันคือกำไรที่ได้รับเพิ่มขึ้นจากที่ผลิตและขายเพิ่มขึ้น 1 หน่วย

http://www.investopedia.com/terms/m/marginal-profit.asp

หรืออธิบายเอาคนที่ไม่ค่อยได้ยุ่งเกี่ยวเรื่อง Economic มากเท่าไหร่ก็อธิบายตามเว็บนี้

http://yarntree.com/marketing/009marginal.htm

เขาบอกว่ามันคือกำไรที่เพิ่มขึ้นจากการขายเพิ่มขึ้น 1 หน่วย

Marginal profit = (selling price) – (total variable costs for 1 unit)

จะเห็นว่า มันคือผลต่างระหว่าง ราคาขาย กับ ต้นทุนผันแปร (variable costs) 1 หน่วย

 

อ้าว … แล้วต้นทุนคงที่ (Fixed cost) หล่ะ?

อย่าลืมว่า ไม่ว่าเราจะขายของเพิ่มขึ้นหรือลดลง Fixed Cost มันก็เท่าเดิม ดังนั้น กำไรที่เพิ่มขึ้น  1 หน่วยมันก็เลยไม่เกี่ยวกับ Fixed Cost งงมะ?

อ่ะ ยกตัวอย่างเช่น กำไรที่เพิ่มขึ้นจาการขายไอ้ติมชิ้นที่ 50 กับ 51

Marginal Profit = P51 -P50

Marginal Profit = (Sale51 – TVC51 – TFC) – (Sale50 – TVC50 -TFC)

Marginal Profit = Sale51 – TVC51 -TFC – Sale50 +TVC50 +  TFC

Marginal Profit = (Sale51 – Sale50) – (TVC51 – TVC50)

เห็นมะ จากสมการแล้ว TFC มันหายไป ….. เข้าใจหรือยังว่าทำไมไม่เอามารวม

ถ้าเราผลิตแล้วขายของจนกระทั่ง Marginal Profit มันเท่ากับต้นทุนคงที่รวมพอดี เราเรียกจุดจุดนั้นว่า Break Even Point คือจำนวนที่ขายแล้วเท่าทุน

slide_14

 

จบมะ?