St. Petersburg Paradox with Python

จากบล็อกของ house 1 และ 2

ในกรณีแรก พบว่าผู้เล่นต้องจ่ายเงินเพิ่มขึ้นตามจำนวนครั้งของการทอย เราเรียกกรณีนี้ว่ากรณีเชิงเส้น (linear) ซึ่งการโยนแต่ละครั้งมีโอกาสที่เกมจะหยุดอยู่หนึ่งในหก ให้ i เป็นจำนวนครั้งของการทอยเต๋า โอกาสที่เกมจะหยุดและทำให้ผู้เล่นต้องเสียเงินในแต่ละรอบการทอยเต๋าเป็น $$Loss(i) = i \cdot (\frac{5}{6})^{i - 1} \cdot \frac{1}{6}$$

ในกรณีที่สอง ผู้เล่นเสียเงินเพิ่มเป็นสองเท่าทุกๆครั้งที่ทอยเพิ่ม เราเรียกกรณีนี้ว่าเป็นเอ็กซ์โพเน็นเชียล (exponential) เขียนสมการได้เป็น $$Loss(i) = 2^{i - 1} \cdot (\frac{5}{6})^{i - 1} \cdot \frac{1}{6}$$

เอามาเขียนโดยใช้ไพทอนได้ดังนี้

#!/usr/bin/python

# Linear case:
def loss(n):
    ’ Determine the loss at n-th order in linear case ‘
    order = []
    for i in range(1, n + 1):
        order.append(i * (5 ** (i - 1)) / float(6 ** i))
    return order

def gen(n, step = 1):
    ’ Generate a list of linear case, which is used in plotting ‘
    y = []
    for i in range(1, n + 1, step):
        y.append(reduce(lambda x, y: x + y, loss(i)))
    return y

# Exponential case:
def loss2(n):
    ’ Determine the loss at n-th order in linear case ‘
    order = []
    for i in range(1, n + 1):
        order.append((10 ** (i - 1)) / float(6 ** i))
    return order

def gen2(n, step = 1):
    ’ Generate a list of exponential case, which is used in plotting ‘
    y = []
    for i in range(1, n + 1, step):
        y.append(reduce(lambda x, y: x + y, loss2(i)))
    return y

if __name__ == ’__main__’:

    from pylab import *

    figure()
    title(‘Linear case’)
    plot(gen(100))

    figure()
    title(‘Exponential case’)
    plot(gen2(100))

    show()

จากโปรแกรมนี้เราจะได้กราฟของทั้งสองกรณี เห็นได้ว่ากราฟแรกนั้นลู่เข้าหาค่าค่าหนึ่ง ซึ่งค่านี้ก็คือคำตอบของกรณีนี้นี่เอง ทว่าในกรณีหลังค่าที่ได้นั้นกลับเพิ่มขึ้นไปเรื่อยๆจนเข้าใกล้ Infinity

St Petersburg Paradox 1: Linear caseSt Petersburg Paradox 1: Linear case

St Petersburg Paradox 2: Exponential caseSt Petersburg Paradox 2: Exponential case

องค์ราชาและสามเจ้าหญิง

เรื่องเก่าแต่เอามาเล่าใหม่

ณ อาณาจักรแห่งหนึ่งอันไกลโพ้น มีองค์ราชาที่ทรงโปรดปรานเกมทายปัญหาเป็นอย่างยิ่ง อยู่มาวันหนึ่ง องค์ราชาได้จัดงานวันเกิดของลูกสาวทั้งสาม ที่สุดแสนจะบังเอิญมีวันคล้ายวันเกิดเป็นวันเดียวกัน

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

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

  • “อันว่าลูกสาวของเรานี้ อายุอานามคูณกัน มีค่าเท่ากับสามสิบหกถ้วน”

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

  • “ลูกสาวของเรา อายุรวมกัน มีค่าเท่ากับจำนวนหน้าต่างของตึกหลังโน้น”

ว่าแล้วพระราชาก็ชี้ไปที่ตึกเก่าๆตึกหนึ่งซึ่งผู้คนต่างมองตามกันและสำรวจโดยรอบ

.. แต่ถึงกระนั้น ก็ไม่มีใครทายได้เลย พระราชาจึงต้องใบ้อีกครั้งว่า

  • “ลูกสาวคนเล็กของเรา ชอบกินไอติม”

ทันใดนั้นเอง!! สุดยอดนักปราชญ์ผู้หนึ่งได้เอ่ยขึ้นว่า

“ข้ารู้แล้ว อายุลูกสาวของท่าน แต่ละคนก็คือ …”

นักปราชญ์ท่านนั้นรู้คำตอบแล้ว ท่านรู้หรือยัง? ลองคิดกันดู

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

บางทีสิ่งที่สำคัญที่สุดของปัญหานั้นไม่ใช่คำตอบ แต่เป็นการค้นหาคำตอบเองต่างหาก

Install Apache/Subversion on Debian Lenny and Migrate the Repositories

Install Subversion/Apache

sudo aptitude install subversion apache2 libapache2-svn

Subversion Configuration

Create subversion repositories:

sudo mkdir /var/svn
sudo chown -R www-data:www-data /var/svn

All our subversion repositories should be located in /var/svn in order to be visible to Apache (you can change /var/svn to something else).

SSL (Secure Sockets Layer)

The following steps are required if you need SSL, otherwise skip this chapter.

sudo aptitude install openssl ssl-cert
a2enmod ssl

“Listen 443” should already exist in /etc/apache2/ports.conf, otherwise add it manually:

sudo vi /etc/apache2/ports.conf

Create a new SSL config file (replace ssl.new.site with your preferred name):

sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl.new.site

Edit the file:

sudo vi /etc/apache2/sites-available/ssl.new.site

Replace:

<VirtualHost *:80>

with

<VirtualHost *:443>

Before </VirtualHost>, add:

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/ssl.new.site.pem

You can try using the template from “default-ssl” instead of “default”, which is easier and more reliable since many SSL-related configurations are already handled. However, I haven’t tried this method and I’m not sure if it works without modifications. See http://www.longspine.com/node/10#comment-23.

Create SSL certificate file:

sudo mkdir /etc/apache2/ssl
sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/ssl.new.site.pem

Enable the new site:

sudo a2ensite ssl.new.site
sudo /etc/init.d/apache2 reload

To see if the setup works, use your web browser to visit:

https://server.ip/

Replace server.ip with the ip of your server. There should be a pop-up or an alert about the new certificate.

DAV_SVN Configuration

Edit /etc/apache2/mods-available/dav_svn.conf and follow the guidline:

sudo vi /etc/apache2/mods-available/dav_svn.conf

Normally it looks like this:

<Location /svn>
  DAV svn
  SVNParentPath /var/svn

  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/apache2/dav_svn.passwd

  Require valid-user
  SSLRequireSSL      # this line must be added if you want SSL enabled

</Location>

Enable the mod and restart:

sudo a2enmod dav_svn
sudo /etc/init.d/apache2 restart

Create a user account for dav_svn:

sudo htpasswd -c /etc/apache2/dav_svn.passwd user1

To add more users, use:

sudo htpasswd /etc/apache2/dav_svn.passwd user2

Subversion Testing

sudo svnadmin create /var/svn/test
sudo chown -R www-data:www-data /var/svn/test

svn co https://new.site/svn/test

If it says “Checked out revision 0.” then Hooray!!, otherwise try looking for the errors on the Internet. You probably forgot something or I forgot to mention some details.

Migration

Skip this chapter if you don’t need to migrate you data from your old server.

On the old server, we need to dump all updates into a single file. Each repository must be done separately.

mkdir svndump
cd svndump

sudo svnadmin dump /var/svn/repository > ./repository.dump

cd ..
tar zcvf svndump.tgz svndump
scp svndump.tgz username@new.server.ip:./

Those dump files must be applied on the new system’s repositories.

tar zxvf svndump.tgz
cd /var/svn/repository

sudo svnadmin create repository-name
sudo svnadmin load repository-name < ~/svndump/repository.dump

sudo chown -R www-data:www-data /var/svn/*

Congratulations! All your code is already migrated.

Terminology Related to Reliabiliy of Systems

ก่อนที่จะขึ้นเนื้อหาเกี่ยวกับ ความเชื่อถือได้ของระบบ (reliabiliy of systems) นั้นเราจำเป็นต้องเข้าใจศัพท์พื้นฐานเสียก่อน และเนื่องจากคำศัทพ์ในสาขานี้นั้นมีนิยามที่ไม่แน่ชัด และไม่สามารถแปลเป็นภาษาไทยได้ชัดเจน ดังนั้นศัพท์เทคนิคทุกคำจะมีภาษาอังกฤษกำกับไว้ภายในวงเล็บ

ความแตกต่างของ ตำหนิ ข้อผิดพลาด และความผิดพลาด

ก่อนที่เราจะทำความเข้าใจความหมายของคำอื่นๆนั้น เราจะต้องทำความเข้าใจกับความแตกต่างของ ตำหนิ (defect) ข้อผิดพลาด (fault/error) และความผิดพลาด (failure) เสียก่อน

  • ตำหนิ (defect) เป็นสาเหตุของการไปสูข้อผิดพลาด (fault/error)
  • ข้อผิดพลาด (fault/error) เป็นสถานะของระบบที่มีตำหนิ (defect) และสามารถเกิดความผิดพลาด (failure) ขึ้นได้
  • ความผิดพลาด (failure) เป็นเหตุการณืที่ระบบไม่กระทำตามหน้าที่ที่ระบุไว้

อาจมองได้ว่าความแตกต่างของข้อผิดพลาด (fault) และความผิดพลาด (failure) คือมุมมองที่แตกต่างกัน โดยความผิดพลาด (failure) เป็นการมองถึงภาพรวมของระบบ ส่วนข้อผิดพลาด (fault/error) นั้นเป้นการมองในโครงสร้างของระบบ

อย่างไรก็ตาม ความหมายของคำทั้งสามมีความกำกวม ไม่เฉพาะในภาษาไทยแต่รวมไปถึงภาษาอังกฤษและภาษาเยอรมัน ในตำราบางเล่มเราจะพบคำนิยามที่แตกต่างออกไป รวมไปถึงความไม่สอดคล้องกันของนิยามแต่ละแบบ เช่น fault อาจแตกต่างจาก error ในบางตำรา

ชนิดของข้อผิดพลาด (failure)

ข้อผิดพลาดสามารถแบ่งออกได้เป็นสองชนิดคือ

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

ความเชื่อถือได้

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

ความเชื่อถือได้ (reliability) มักวัดจากอัตราการเกิดความผิดพลาด (failure rate) ของระบบ ซึ่งใช้สัญลักษณ์ $\lambda$ แทนความหมาย เมื่ออัตราการเกิดความผิดพลาดสูง ความเชื่อถือได้ก็จะต่ำ

ความเสี่ยงและความปลอดภัย

ความเสี่ยง (risk) คือความสัมพันธ์ระหว่างความรุนแรงของเหตุการณ์ที่จะเกิด และความน่าจะเป็นที่เหตุการณ์นั้นจะเกิด สามารถเขียนเป็นสมการได้เป็น $$ Risk = Probability \cdot Damage$$

ความปลอดภัย (safety) คือสถานการณ์ที่ความเสี่ยง (risk) ของระบบนั้นไม่สูงเกินขอบเขตที่กำหนด

สังเกตได้ว่าความปลอดภัยนั้นมีความสัมพันธ์กับการกำหนดขอบเขต เป็นปริมาณเชิงสัมพัทธ์ไม่ใช่สมบูรณ์ ดังนั้นในทางวิศวกรรมแล้วไม่มีทางที่ระบบใดๆจะเป็นระบบที่ปลอดภัยได้เต็มร้อยเปอร์เซนต์

คำว่าความปลอดภัยที่ได้ยินกันในชีวิตประจำวันนั้นไม่ใช่ความปลอดภัยในเชิงวิศกรรม

ความน่าเชื่อถือ

ความน่าเชื่อถือ (dependability) นั้นเป็นการวัดความปลอดภัย (safety) และความเชื่อถือได้ (reliability) โดยรวมของระบบ ซึ่งเป็นการพิจารณาโดยภาพรวมและมักนำสิ่งแวดล้อมของระบบมาพิจารณาร่วมด้วย หรือในอีกนัยหนึ่ง ระบบที่มีความน่าเชื่อถือได้นั้นต้องมีความปลอดภัยและความเชื่อถือได้ (dependability = safety + reliability)

แต่โดยในความหมายทั่วไปแล้วความน่าเชื่อถือมีความหมายเช่นเดียวกับความเชื่อถือได้ (dependability = reliability) เพื่อลดความสับสนระหว่างศัพท์ที่ยังกำกวม เนื้อหาในบทความถัดๆไปจะใช้คำสองคำนี้ในความหมายของความเชื่อถือได้ (reliabiliy)

Black/White, Apple/Anti-Apple

เมื่อมีสีขาว มันก็มีสีดำ เมื่อมีสาวก มันก็จะมีอสาวกขึ้นมา

คำว่าสาวกนั้นอาจมีที่มาจากคำว่า”ผู้ฟัง”ในภาษาอื่น ดังนั้น”ผู้ไม่ฟัง”อาจถูกเรียกได้อีกอย่างว่า อสาวก และหากสิ่งที่เป็นปัญหาของสาวกคือการฟังเพียงแค่ข้างเดียวแล้วหละก็ ปัญหาที่สำคัญอย่างยิ่งของอสาวกคือการเลิกฟังด้านใดด้านหนึ่ง หรือการไม่รับฟังความเห็นอีกด้านนั่นเอง

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

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

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

ความเห็นของสาวกแอปเปิลในบล็อกนัน บ้างก็งี่เง่า แก่นแก้วแก่นกริยานั้นกรรมแก่การก่อให้เกิดการเกรียน แต่ทว่าความเห็นของอสาวกที่แย่ในระดับเดียวกันก็ใช่ว่าจะไม่มี โดยเฉพาะข้อความในลักษณะการดูถูกถากถาง

แต่ทำไมหลายๆที่ถึงมีแต่การอ้างอคติต่อเพียงความเห็นของสาวก? หรือมนุษย์เราทนรับความผิดพลาดเล็กๆน้อยๆของคนกลุ่มหนึ่งได้ แต่กลับเพิกเฉยไม่ได้ต่อทัศนะคติที่ตรงกันข้าม?

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

ปล. บทความนี้เขียนขึ้นเพื่อตอบคอมเมนท์ในหัวข้อ Apple Apple Apple ! จากเว็บไซท์ BioLawCom.de โดยมีการแก้ไขเล็กน้อยเพื่อความสะใจของคนเขียน

Syndicate content