├── source ├── people.md ├── science.md ├── video.md ├── article.md ├── discuss.md ├── message.md ├── preface.md ├── pdffooter.htm ├── md0.js ├── Makefile ├── convert.exe ├── mimetex.exe ├── title.md ├── tex2img.bat ├── metadata.xml ├── message3.md ├── header.htm ├── footer.htm ├── science1.md ├── license.md ├── reflink.md9 ├── editor.md ├── messageGPGPU.md ├── video1.md ├── home.md ├── people2.md ├── message2.md ├── info.md ├── people1.md ├── article4.md ├── article1.md ├── message1.md ├── article6.md0 ├── article6.md ├── discuss1.md └── article2.md ├── submit ├── Intro-Moving-Avg │ ├── cinput.bak │ ├── sma.py~ │ ├── Ma-Type1-Figure.aux │ ├── exp-avg.py~ │ ├── Ma-Type1-ztrans-Figure.aux │ ├── Ma-FIR-1.tex~ │ ├── .DS_Store │ ├── MA_N_4_freq.fig │ ├── Exp-Avg-Diagram.eps │ ├── Exp-Avg-Diagram.odg │ ├── Exp-Avg-Diagram.pdf │ ├── Intro-Moving-Avg.ctx │ ├── Intro-Moving-Avg.dvi │ ├── Intro-Moving-Avg.pdf │ ├── Intro-Moving-Avg.tex │ ├── Ma-Type1-Figure.dvi │ ├── Ma-Type1-Figure.jp2 │ ├── Ma-Type1-Figure.pdf │ ├── Ma-Type1-Figure.png │ ├── Intro-Moving-Avg.ctx~ │ ├── Ma-Type1-Figure.synctex.gz │ ├── Ma-Type1-ztrans-Figure.dvi │ ├── Ma-Type1-ztrans-Figure.png │ ├── Ma-Type1-ztrans-Figure.synctex.gz │ ├── Ma-FIR-1.tex │ ├── sma.m~ │ ├── Intro-Moving-Avg.xlg │ ├── build │ ├── DC-Blocker-1.tex~ │ ├── sma.m │ ├── DC-Blocker-1.tex │ ├── sma.dat │ ├── Intro-Moving-Avg.tex~ │ ├── missfont.log │ ├── ExpAvgZTrans.tex │ ├── Ma-Type1-Figure.tex │ ├── Ma-Type1-Figure.tex~ │ ├── ExpAvgZTrans.tex~ │ ├── Ma-Type1-ztrans-Figure.tex │ ├── MA-Type1-z-trans.tex~ │ ├── Fibonacci.tex │ ├── Fibonacci.tex~ │ ├── MA-Type1-z-trans.tex │ ├── MA-Type1.aux │ ├── MA-IIR-ztrans.tex │ ├── sma.py │ ├── Fibonacci.aux │ ├── ExpAvgTimeEqn.aux │ ├── ExpAvgZTrans.aux │ ├── MA-IIR-ztrans.aux │ ├── MA-Type1-z-trans.aux │ ├── MA-Type1.tex~ │ ├── ExpAvg-Alpha-1over16.tex │ ├── ExpAvgTimeEqn.tex │ ├── ExpAvgTimeEqn.tex~ │ ├── MA-Type1.tex │ ├── exp-avg.py │ ├── cinput.tex │ ├── avg_exp.dat │ ├── Ma-Type1-Figure.log │ └── Ma-Type1-ztrans-Figure.log ├── iNEXT.zip ├── Intro-Moving-Avg.zip └── __MACOSX │ └── Intro-Moving-Avg │ ├── ._.DS_Store │ └── ._Intro-Moving-Avg.pdf ├── code.zip ├── book ├── A4.pdf ├── A4.epub ├── ipad.epub └── ipad.pdf ├── img ├── Pong.jpg ├── Pong.png ├── RFig1.jpg ├── RFig2.jpg ├── cover.jpg ├── AvgFig1.jpg ├── AvgFig10.jpg ├── AvgFig11.jpg ├── AvgFig2.jpg ├── AvgFig3.jpg ├── AvgFig4.jpg ├── AvgFig5.jpg ├── AvgFig6.jpg ├── AvgFig7.jpg ├── AvgFig8.jpg ├── AvgFig9.jpg ├── coverA4.png ├── prefix1.JPG ├── prefix2.JPG ├── prefix3.JPG ├── prefix4.JPG ├── prefix5.JPG ├── prefix6.JPG ├── ChisqPPlot.jpg ├── LOLChampion.png ├── ArduinoServo1.png ├── ArduinoServo2.png ├── Nolan_Bushnell.jpg ├── ArduinoServoBoard1.png └── ArduinoServoCircuit1.png ├── timg ├── 0010f24dbf35.jpg ├── 00cbaae89778.jpg ├── 01dba172fdeb.jpg ├── 020e71d9cec6.jpg ├── 042c0e6771cd.jpg ├── 05612f0a5794.jpg ├── 08e08af8fcf1.jpg ├── 0a55ffecc693.jpg ├── 0aa37261b1c3.jpg ├── 0dcb2bf4d557.jpg ├── 0e1443164864.jpg ├── 14d4aa16392d.jpg ├── 156736be7191.jpg ├── 1678f3e8aff5.jpg ├── 1ac98cbacf5d.jpg ├── 1b47eeb41ee1.jpg ├── 1b67371903c9.jpg ├── 1c3d0a61f717.jpg ├── 1c9ac1f07d71.jpg ├── 1d2ab0938302.jpg ├── 20cd69035be5.jpg ├── 25c061178b1b.jpg ├── 2bc64e7b7791.jpg ├── 2dcf57924d26.jpg ├── 2f6a5e5c59f0.jpg ├── 32960354f0b9.jpg ├── 342551799b8b.jpg ├── 3a3ea00cfc35.jpg ├── 3ae2e9294398.jpg ├── 3bad11696277.jpg ├── 40853c87a0e1.jpg ├── 4247fc4e9559.jpg ├── 4402073c9654.jpg ├── 4424522a20fd.jpg ├── 4577c29298a5.jpg ├── 474abe12bfc3.jpg ├── 4b43853d059b.jpg ├── 4c3aa1bbc317.jpg ├── 4dac25bca00f.jpg ├── 4e4867259d13.jpg ├── 4f08e3dba63d.jpg ├── 5263eb30532a.jpg ├── 537e42306196.jpg ├── 5467ce985981.jpg ├── 55202c2e6d17.jpg ├── 5575f4ceb7ec.jpg ├── 55f3f49d7a89.jpg ├── 571ca3d7c7a5.jpg ├── 58b5664cb90e.jpg ├── 58fff8209500.jpg ├── 59bdf0ba696e.jpg ├── 5adf65d04b87.jpg ├── 5b69bc2712cc.jpg ├── 5bda4e3ebc5d.jpg ├── 5dbc98dcc983.jpg ├── 5e2f33ebf381.jpg ├── 5efeebd0f700.jpg ├── 5f569369b46d.jpg ├── 60855b83ca47.jpg ├── 60c13e05d3ec.jpg ├── 61f5525b072e.jpg ├── 628b9a326ba9.jpg ├── 68c6edd176d1.jpg ├── 6b90439c29bf.jpg ├── 6d23a1099e1e.jpg ├── 6db5f6c29040.jpg ├── 6e61fe64d722.jpg ├── 6e88e3b57497.jpg ├── 70a0f27af98f.jpg ├── 74dceb1a25f0.jpg ├── 7505c1e8a38a.jpg ├── 75309442d573.jpg ├── 75edc6420794.jpg ├── 76970b1b1111.jpg ├── 770530eadce1.jpg ├── 78155d2ec4b0.jpg ├── 7832dac13bec.jpg ├── 7b4fb4b370b0.jpg ├── 7b7f9dbfea05.jpg ├── 7b8b965ad4bc.jpg ├── 7d433fbb1182.jpg ├── 81ffcf4cdde6.jpg ├── 8355332d57a2.jpg ├── 83c72463717c.jpg ├── 840fc8faa95c.jpg ├── 865c0c0b4ab0.jpg ├── 877a5ca0f4fa.jpg ├── 8860d8433aff.jpg ├── 88a68437ce17.jpg ├── 8de2b7e93bf6.jpg ├── 8ece14977518.jpg ├── 8ed89aa7b851.jpg ├── 9072920d51e8.jpg ├── 90bff388daef.jpg ├── 915e65791a39.jpg ├── 91c474acddee.jpg ├── 92e4da341fe8.jpg ├── 93c4119f2946.jpg ├── 99053e25ea01.jpg ├── 9b3e1452602d.jpg ├── 9dad43eddec9.jpg ├── a0a9427f99fb.jpg ├── a4268c738e93.jpg ├── a4efefe3444a.jpg ├── a82e036aca4f.jpg ├── a83ea75f5993.jpg ├── a918f5a94a3f.jpg ├── af588ddfed0e.jpg ├── afe2179e08f3.jpg ├── b0603860fcff.jpg ├── b096cbc3716d.jpg ├── b26c3c7d1354.jpg ├── b4c61a87a281.jpg ├── bbe5b9e9cfa0.jpg ├── bcb89257537a.jpg ├── bcce8d1a60ac.jpg ├── bdd9365a07ff.jpg ├── c0b5b2681cfd.jpg ├── c0e40ebe71d7.jpg ├── c39e022d2205.jpg ├── c50db37f8175.jpg ├── c928907f07c3.jpg ├── c9c3e3a5b193.jpg ├── c9faf6ead2cd.jpg ├── cb03916a7df7.jpg ├── cbfd9235adc8.jpg ├── cc6b8d4028dc.jpg ├── ce9249c8a8b7.jpg ├── d2606be4e0cd.jpg ├── d31371910256.jpg ├── d378a88523cf.jpg ├── d70d5b85ce83.jpg ├── ddd793090e4a.jpg ├── dddbde759064.jpg ├── deea0a27a5b3.jpg ├── e0093af2f546.jpg ├── e21ff5d2c6ad.jpg ├── ea2cd385799b.jpg ├── f67ed6db9325.jpg ├── f6e1a81168e2.jpg ├── f75c218c9489.jpg ├── fb3a60fa09df.jpg ├── fd6442230b9c.jpg ├── fd820c985ac2.jpg ├── fee9fbc99e90.jpg └── ff6846bb3c64.jpg ├── code ├── mcu0m.hex └── mcu0m.v ├── htm ├── article.html ├── message.html ├── people.html ├── video.html ├── preface.html ├── science.html ├── discuss.html ├── message3.html ├── title.html ├── science1.html ├── editor.html ├── license.html ├── messageGPGPU.html ├── people2.html ├── video1.html ├── message2.html ├── home.html ├── people1.html ├── info.html ├── message1.html ├── article1.html └── article4.html └── css └── pmag.css /source/people.md: -------------------------------------------------------------------------------- 1 | 2 | # 人物速寫 3 | -------------------------------------------------------------------------------- /source/science.md: -------------------------------------------------------------------------------- 1 | # 程式與科學 2 | -------------------------------------------------------------------------------- /source/video.md: -------------------------------------------------------------------------------- 1 | 2 | # 影音頻道 3 | -------------------------------------------------------------------------------- /source/article.md: -------------------------------------------------------------------------------- 1 | 2 | # 程式人文集 3 | -------------------------------------------------------------------------------- /source/discuss.md: -------------------------------------------------------------------------------- 1 | # 程式人討論區 2 | 3 | -------------------------------------------------------------------------------- /source/message.md: -------------------------------------------------------------------------------- 1 | 2 | # 程式人短訊 3 | -------------------------------------------------------------------------------- /source/preface.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 3 | 4 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/cinput.bak: -------------------------------------------------------------------------------- 1 | 0 0 2 | -------------------------------------------------------------------------------- /source/pdffooter.htm: -------------------------------------------------------------------------------- 1 |
_PAGENUM_
2 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/sma.py~: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | -------------------------------------------------------------------------------- /code.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/code.zip -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-Figure.aux: -------------------------------------------------------------------------------- 1 | \relax 2 | \@input{MA-Type1.aux} 3 | -------------------------------------------------------------------------------- /book/A4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/book/A4.pdf -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/exp-avg.py~: -------------------------------------------------------------------------------- 1 | class expAvg(object): 2 | def expAvg(alpha): 3 | -------------------------------------------------------------------------------- /book/A4.epub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/book/A4.epub -------------------------------------------------------------------------------- /book/ipad.epub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/book/ipad.epub -------------------------------------------------------------------------------- /book/ipad.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/book/ipad.pdf -------------------------------------------------------------------------------- /img/Pong.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/Pong.jpg -------------------------------------------------------------------------------- /img/Pong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/Pong.png -------------------------------------------------------------------------------- /img/RFig1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/RFig1.jpg -------------------------------------------------------------------------------- /img/RFig2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/RFig2.jpg -------------------------------------------------------------------------------- /img/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/cover.jpg -------------------------------------------------------------------------------- /source/md0.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/source/md0.js -------------------------------------------------------------------------------- /img/AvgFig1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig1.jpg -------------------------------------------------------------------------------- /img/AvgFig10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig10.jpg -------------------------------------------------------------------------------- /img/AvgFig11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig11.jpg -------------------------------------------------------------------------------- /img/AvgFig2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig2.jpg -------------------------------------------------------------------------------- /img/AvgFig3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig3.jpg -------------------------------------------------------------------------------- /img/AvgFig4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig4.jpg -------------------------------------------------------------------------------- /img/AvgFig5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig5.jpg -------------------------------------------------------------------------------- /img/AvgFig6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig6.jpg -------------------------------------------------------------------------------- /img/AvgFig7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig7.jpg -------------------------------------------------------------------------------- /img/AvgFig8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig8.jpg -------------------------------------------------------------------------------- /img/AvgFig9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/AvgFig9.jpg -------------------------------------------------------------------------------- /img/coverA4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/coverA4.png -------------------------------------------------------------------------------- /img/prefix1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/prefix1.JPG -------------------------------------------------------------------------------- /img/prefix2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/prefix2.JPG -------------------------------------------------------------------------------- /img/prefix3.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/prefix3.JPG -------------------------------------------------------------------------------- /img/prefix4.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/prefix4.JPG -------------------------------------------------------------------------------- /img/prefix5.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/prefix5.JPG -------------------------------------------------------------------------------- /img/prefix6.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/prefix6.JPG -------------------------------------------------------------------------------- /source/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/source/Makefile -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-ztrans-Figure.aux: -------------------------------------------------------------------------------- 1 | \relax 2 | \@input{MA-Type1-z-trans.aux} 3 | -------------------------------------------------------------------------------- /submit/iNEXT.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/iNEXT.zip -------------------------------------------------------------------------------- /img/ChisqPPlot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/ChisqPPlot.jpg -------------------------------------------------------------------------------- /img/LOLChampion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/LOLChampion.png -------------------------------------------------------------------------------- /source/convert.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/source/convert.exe -------------------------------------------------------------------------------- /source/mimetex.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/source/mimetex.exe -------------------------------------------------------------------------------- /img/ArduinoServo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/ArduinoServo1.png -------------------------------------------------------------------------------- /img/ArduinoServo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/ArduinoServo2.png -------------------------------------------------------------------------------- /timg/0010f24dbf35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/0010f24dbf35.jpg -------------------------------------------------------------------------------- /timg/00cbaae89778.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/00cbaae89778.jpg -------------------------------------------------------------------------------- /timg/01dba172fdeb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/01dba172fdeb.jpg -------------------------------------------------------------------------------- /timg/020e71d9cec6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/020e71d9cec6.jpg -------------------------------------------------------------------------------- /timg/042c0e6771cd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/042c0e6771cd.jpg -------------------------------------------------------------------------------- /timg/05612f0a5794.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/05612f0a5794.jpg -------------------------------------------------------------------------------- /timg/08e08af8fcf1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/08e08af8fcf1.jpg -------------------------------------------------------------------------------- /timg/0a55ffecc693.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/0a55ffecc693.jpg -------------------------------------------------------------------------------- /timg/0aa37261b1c3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/0aa37261b1c3.jpg -------------------------------------------------------------------------------- /timg/0dcb2bf4d557.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/0dcb2bf4d557.jpg -------------------------------------------------------------------------------- /timg/0e1443164864.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/0e1443164864.jpg -------------------------------------------------------------------------------- /timg/14d4aa16392d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/14d4aa16392d.jpg -------------------------------------------------------------------------------- /timg/156736be7191.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/156736be7191.jpg -------------------------------------------------------------------------------- /timg/1678f3e8aff5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/1678f3e8aff5.jpg -------------------------------------------------------------------------------- /timg/1ac98cbacf5d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/1ac98cbacf5d.jpg -------------------------------------------------------------------------------- /timg/1b47eeb41ee1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/1b47eeb41ee1.jpg -------------------------------------------------------------------------------- /timg/1b67371903c9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/1b67371903c9.jpg -------------------------------------------------------------------------------- /timg/1c3d0a61f717.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/1c3d0a61f717.jpg -------------------------------------------------------------------------------- /timg/1c9ac1f07d71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/1c9ac1f07d71.jpg -------------------------------------------------------------------------------- /timg/1d2ab0938302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/1d2ab0938302.jpg -------------------------------------------------------------------------------- /timg/20cd69035be5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/20cd69035be5.jpg -------------------------------------------------------------------------------- /timg/25c061178b1b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/25c061178b1b.jpg -------------------------------------------------------------------------------- /timg/2bc64e7b7791.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/2bc64e7b7791.jpg -------------------------------------------------------------------------------- /timg/2dcf57924d26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/2dcf57924d26.jpg -------------------------------------------------------------------------------- /timg/2f6a5e5c59f0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/2f6a5e5c59f0.jpg -------------------------------------------------------------------------------- /timg/32960354f0b9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/32960354f0b9.jpg -------------------------------------------------------------------------------- /timg/342551799b8b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/342551799b8b.jpg -------------------------------------------------------------------------------- /timg/3a3ea00cfc35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/3a3ea00cfc35.jpg -------------------------------------------------------------------------------- /timg/3ae2e9294398.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/3ae2e9294398.jpg -------------------------------------------------------------------------------- /timg/3bad11696277.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/3bad11696277.jpg -------------------------------------------------------------------------------- /timg/40853c87a0e1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/40853c87a0e1.jpg -------------------------------------------------------------------------------- /timg/4247fc4e9559.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/4247fc4e9559.jpg -------------------------------------------------------------------------------- /timg/4402073c9654.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/4402073c9654.jpg -------------------------------------------------------------------------------- /timg/4424522a20fd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/4424522a20fd.jpg -------------------------------------------------------------------------------- /timg/4577c29298a5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/4577c29298a5.jpg -------------------------------------------------------------------------------- /timg/474abe12bfc3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/474abe12bfc3.jpg -------------------------------------------------------------------------------- /timg/4b43853d059b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/4b43853d059b.jpg -------------------------------------------------------------------------------- /timg/4c3aa1bbc317.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/4c3aa1bbc317.jpg -------------------------------------------------------------------------------- /timg/4dac25bca00f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/4dac25bca00f.jpg -------------------------------------------------------------------------------- /timg/4e4867259d13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/4e4867259d13.jpg -------------------------------------------------------------------------------- /timg/4f08e3dba63d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/4f08e3dba63d.jpg -------------------------------------------------------------------------------- /timg/5263eb30532a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5263eb30532a.jpg -------------------------------------------------------------------------------- /timg/537e42306196.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/537e42306196.jpg -------------------------------------------------------------------------------- /timg/5467ce985981.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5467ce985981.jpg -------------------------------------------------------------------------------- /timg/55202c2e6d17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/55202c2e6d17.jpg -------------------------------------------------------------------------------- /timg/5575f4ceb7ec.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5575f4ceb7ec.jpg -------------------------------------------------------------------------------- /timg/55f3f49d7a89.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/55f3f49d7a89.jpg -------------------------------------------------------------------------------- /timg/571ca3d7c7a5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/571ca3d7c7a5.jpg -------------------------------------------------------------------------------- /timg/58b5664cb90e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/58b5664cb90e.jpg -------------------------------------------------------------------------------- /timg/58fff8209500.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/58fff8209500.jpg -------------------------------------------------------------------------------- /timg/59bdf0ba696e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/59bdf0ba696e.jpg -------------------------------------------------------------------------------- /timg/5adf65d04b87.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5adf65d04b87.jpg -------------------------------------------------------------------------------- /timg/5b69bc2712cc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5b69bc2712cc.jpg -------------------------------------------------------------------------------- /timg/5bda4e3ebc5d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5bda4e3ebc5d.jpg -------------------------------------------------------------------------------- /timg/5dbc98dcc983.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5dbc98dcc983.jpg -------------------------------------------------------------------------------- /timg/5e2f33ebf381.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5e2f33ebf381.jpg -------------------------------------------------------------------------------- /timg/5efeebd0f700.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5efeebd0f700.jpg -------------------------------------------------------------------------------- /timg/5f569369b46d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/5f569369b46d.jpg -------------------------------------------------------------------------------- /timg/60855b83ca47.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/60855b83ca47.jpg -------------------------------------------------------------------------------- /timg/60c13e05d3ec.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/60c13e05d3ec.jpg -------------------------------------------------------------------------------- /timg/61f5525b072e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/61f5525b072e.jpg -------------------------------------------------------------------------------- /timg/628b9a326ba9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/628b9a326ba9.jpg -------------------------------------------------------------------------------- /timg/68c6edd176d1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/68c6edd176d1.jpg -------------------------------------------------------------------------------- /timg/6b90439c29bf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/6b90439c29bf.jpg -------------------------------------------------------------------------------- /timg/6d23a1099e1e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/6d23a1099e1e.jpg -------------------------------------------------------------------------------- /timg/6db5f6c29040.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/6db5f6c29040.jpg -------------------------------------------------------------------------------- /timg/6e61fe64d722.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/6e61fe64d722.jpg -------------------------------------------------------------------------------- /timg/6e88e3b57497.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/6e88e3b57497.jpg -------------------------------------------------------------------------------- /timg/70a0f27af98f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/70a0f27af98f.jpg -------------------------------------------------------------------------------- /timg/74dceb1a25f0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/74dceb1a25f0.jpg -------------------------------------------------------------------------------- /timg/7505c1e8a38a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/7505c1e8a38a.jpg -------------------------------------------------------------------------------- /timg/75309442d573.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/75309442d573.jpg -------------------------------------------------------------------------------- /timg/75edc6420794.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/75edc6420794.jpg -------------------------------------------------------------------------------- /timg/76970b1b1111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/76970b1b1111.jpg -------------------------------------------------------------------------------- /timg/770530eadce1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/770530eadce1.jpg -------------------------------------------------------------------------------- /timg/78155d2ec4b0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/78155d2ec4b0.jpg -------------------------------------------------------------------------------- /timg/7832dac13bec.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/7832dac13bec.jpg -------------------------------------------------------------------------------- /timg/7b4fb4b370b0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/7b4fb4b370b0.jpg -------------------------------------------------------------------------------- /timg/7b7f9dbfea05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/7b7f9dbfea05.jpg -------------------------------------------------------------------------------- /timg/7b8b965ad4bc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/7b8b965ad4bc.jpg -------------------------------------------------------------------------------- /timg/7d433fbb1182.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/7d433fbb1182.jpg -------------------------------------------------------------------------------- /timg/81ffcf4cdde6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/81ffcf4cdde6.jpg -------------------------------------------------------------------------------- /timg/8355332d57a2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/8355332d57a2.jpg -------------------------------------------------------------------------------- /timg/83c72463717c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/83c72463717c.jpg -------------------------------------------------------------------------------- /timg/840fc8faa95c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/840fc8faa95c.jpg -------------------------------------------------------------------------------- /timg/865c0c0b4ab0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/865c0c0b4ab0.jpg -------------------------------------------------------------------------------- /timg/877a5ca0f4fa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/877a5ca0f4fa.jpg -------------------------------------------------------------------------------- /timg/8860d8433aff.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/8860d8433aff.jpg -------------------------------------------------------------------------------- /timg/88a68437ce17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/88a68437ce17.jpg -------------------------------------------------------------------------------- /timg/8de2b7e93bf6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/8de2b7e93bf6.jpg -------------------------------------------------------------------------------- /timg/8ece14977518.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/8ece14977518.jpg -------------------------------------------------------------------------------- /timg/8ed89aa7b851.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/8ed89aa7b851.jpg -------------------------------------------------------------------------------- /timg/9072920d51e8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/9072920d51e8.jpg -------------------------------------------------------------------------------- /timg/90bff388daef.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/90bff388daef.jpg -------------------------------------------------------------------------------- /timg/915e65791a39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/915e65791a39.jpg -------------------------------------------------------------------------------- /timg/91c474acddee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/91c474acddee.jpg -------------------------------------------------------------------------------- /timg/92e4da341fe8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/92e4da341fe8.jpg -------------------------------------------------------------------------------- /timg/93c4119f2946.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/93c4119f2946.jpg -------------------------------------------------------------------------------- /timg/99053e25ea01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/99053e25ea01.jpg -------------------------------------------------------------------------------- /timg/9b3e1452602d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/9b3e1452602d.jpg -------------------------------------------------------------------------------- /timg/9dad43eddec9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/9dad43eddec9.jpg -------------------------------------------------------------------------------- /timg/a0a9427f99fb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/a0a9427f99fb.jpg -------------------------------------------------------------------------------- /timg/a4268c738e93.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/a4268c738e93.jpg -------------------------------------------------------------------------------- /timg/a4efefe3444a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/a4efefe3444a.jpg -------------------------------------------------------------------------------- /timg/a82e036aca4f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/a82e036aca4f.jpg -------------------------------------------------------------------------------- /timg/a83ea75f5993.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/a83ea75f5993.jpg -------------------------------------------------------------------------------- /timg/a918f5a94a3f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/a918f5a94a3f.jpg -------------------------------------------------------------------------------- /timg/af588ddfed0e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/af588ddfed0e.jpg -------------------------------------------------------------------------------- /timg/afe2179e08f3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/afe2179e08f3.jpg -------------------------------------------------------------------------------- /timg/b0603860fcff.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/b0603860fcff.jpg -------------------------------------------------------------------------------- /timg/b096cbc3716d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/b096cbc3716d.jpg -------------------------------------------------------------------------------- /timg/b26c3c7d1354.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/b26c3c7d1354.jpg -------------------------------------------------------------------------------- /timg/b4c61a87a281.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/b4c61a87a281.jpg -------------------------------------------------------------------------------- /timg/bbe5b9e9cfa0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/bbe5b9e9cfa0.jpg -------------------------------------------------------------------------------- /timg/bcb89257537a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/bcb89257537a.jpg -------------------------------------------------------------------------------- /timg/bcce8d1a60ac.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/bcce8d1a60ac.jpg -------------------------------------------------------------------------------- /timg/bdd9365a07ff.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/bdd9365a07ff.jpg -------------------------------------------------------------------------------- /timg/c0b5b2681cfd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/c0b5b2681cfd.jpg -------------------------------------------------------------------------------- /timg/c0e40ebe71d7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/c0e40ebe71d7.jpg -------------------------------------------------------------------------------- /timg/c39e022d2205.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/c39e022d2205.jpg -------------------------------------------------------------------------------- /timg/c50db37f8175.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/c50db37f8175.jpg -------------------------------------------------------------------------------- /timg/c928907f07c3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/c928907f07c3.jpg -------------------------------------------------------------------------------- /timg/c9c3e3a5b193.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/c9c3e3a5b193.jpg -------------------------------------------------------------------------------- /timg/c9faf6ead2cd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/c9faf6ead2cd.jpg -------------------------------------------------------------------------------- /timg/cb03916a7df7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/cb03916a7df7.jpg -------------------------------------------------------------------------------- /timg/cbfd9235adc8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/cbfd9235adc8.jpg -------------------------------------------------------------------------------- /timg/cc6b8d4028dc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/cc6b8d4028dc.jpg -------------------------------------------------------------------------------- /timg/ce9249c8a8b7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/ce9249c8a8b7.jpg -------------------------------------------------------------------------------- /timg/d2606be4e0cd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/d2606be4e0cd.jpg -------------------------------------------------------------------------------- /timg/d31371910256.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/d31371910256.jpg -------------------------------------------------------------------------------- /timg/d378a88523cf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/d378a88523cf.jpg -------------------------------------------------------------------------------- /timg/d70d5b85ce83.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/d70d5b85ce83.jpg -------------------------------------------------------------------------------- /timg/ddd793090e4a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/ddd793090e4a.jpg -------------------------------------------------------------------------------- /timg/dddbde759064.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/dddbde759064.jpg -------------------------------------------------------------------------------- /timg/deea0a27a5b3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/deea0a27a5b3.jpg -------------------------------------------------------------------------------- /timg/e0093af2f546.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/e0093af2f546.jpg -------------------------------------------------------------------------------- /timg/e21ff5d2c6ad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/e21ff5d2c6ad.jpg -------------------------------------------------------------------------------- /timg/ea2cd385799b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/ea2cd385799b.jpg -------------------------------------------------------------------------------- /timg/f67ed6db9325.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/f67ed6db9325.jpg -------------------------------------------------------------------------------- /timg/f6e1a81168e2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/f6e1a81168e2.jpg -------------------------------------------------------------------------------- /timg/f75c218c9489.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/f75c218c9489.jpg -------------------------------------------------------------------------------- /timg/fb3a60fa09df.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/fb3a60fa09df.jpg -------------------------------------------------------------------------------- /timg/fd6442230b9c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/fd6442230b9c.jpg -------------------------------------------------------------------------------- /timg/fd820c985ac2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/fd820c985ac2.jpg -------------------------------------------------------------------------------- /timg/fee9fbc99e90.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/fee9fbc99e90.jpg -------------------------------------------------------------------------------- /timg/ff6846bb3c64.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/timg/ff6846bb3c64.jpg -------------------------------------------------------------------------------- /img/Nolan_Bushnell.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/Nolan_Bushnell.jpg -------------------------------------------------------------------------------- /source/title.md: -------------------------------------------------------------------------------- 1 | % 程式人雜誌 2 | % 2013 年 12 月號 3 | % [程式人雜誌社出版](https://www.facebook.com/groups/programmerMagazine/) -------------------------------------------------------------------------------- /img/ArduinoServoBoard1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/ArduinoServoBoard1.png -------------------------------------------------------------------------------- /img/ArduinoServoCircuit1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/img/ArduinoServoCircuit1.png -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg.zip -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-FIR-1.tex~: -------------------------------------------------------------------------------- 1 | 2 | %%% Local Variables: 3 | %%% mode: latex 4 | %%% TeX-master: t 5 | %%% End: 6 | -------------------------------------------------------------------------------- /submit/__MACOSX/Intro-Moving-Avg/._.DS_Store: -------------------------------------------------------------------------------- 1 | Mac OS X  2 R@ -------------------------------------------------------------------------------- /source/tex2img.bat: -------------------------------------------------------------------------------- 1 | if not exist {%2.jpg} ( 2 | mimetex -d %1 -e %2.gif 3 | convert %2.gif %2.jpg 4 | rm %2.gif 5 | ) 6 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/.DS_Store -------------------------------------------------------------------------------- /source/metadata.xml: -------------------------------------------------------------------------------- 1 | Creative Commons Non-Commercial Share Alike 3.0 2 | en-US 3 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/MA_N_4_freq.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/MA_N_4_freq.fig -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Exp-Avg-Diagram.eps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Exp-Avg-Diagram.eps -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Exp-Avg-Diagram.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Exp-Avg-Diagram.odg -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Exp-Avg-Diagram.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Exp-Avg-Diagram.pdf -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Intro-Moving-Avg.ctx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Intro-Moving-Avg.ctx -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Intro-Moving-Avg.dvi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Intro-Moving-Avg.dvi -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Intro-Moving-Avg.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Intro-Moving-Avg.pdf -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Intro-Moving-Avg.tex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Intro-Moving-Avg.tex -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-Figure.dvi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Ma-Type1-Figure.dvi -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-Figure.jp2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Ma-Type1-Figure.jp2 -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-Figure.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Ma-Type1-Figure.pdf -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-Figure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Ma-Type1-Figure.png -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Intro-Moving-Avg.ctx~: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Intro-Moving-Avg.ctx~ -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-Figure.synctex.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Ma-Type1-Figure.synctex.gz -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-ztrans-Figure.dvi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Ma-Type1-ztrans-Figure.dvi -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-ztrans-Figure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Ma-Type1-ztrans-Figure.png -------------------------------------------------------------------------------- /submit/__MACOSX/Intro-Moving-Avg/._Intro-Moving-Avg.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/__MACOSX/Intro-Moving-Avg/._Intro-Moving-Avg.pdf -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-ztrans-Figure.synctex.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201312/gh-pages/submit/Intro-Moving-Avg/Ma-Type1-ztrans-Figure.synctex.gz -------------------------------------------------------------------------------- /source/message3.md: -------------------------------------------------------------------------------- 1 | [國立成功大學全國中小學科普教育生根計畫:夏令研習營 -- 2013夏令研習營](http://www.iaa.ncku.edu.tw/~whlai/hlg/site/index.html) 2 | 3 | * [视频: 使用Mind做有趣的Arduino实验之一:Arduino和Mind介绍](https://www.youtube.com/watch?v=aR32HG4yky4) 4 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-FIR-1.tex: -------------------------------------------------------------------------------- 1 | \begin{pspicture}(0,0)(10,10) 2 | \pssignal(0,0){x}{$x[n]$} 3 | \psblock{d1} 4 | \end{pspicture} 5 | %%% Local Variables: 6 | %%% mode: latex 7 | %%% TeX-master: t 8 | %%% End: 9 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/sma.m~: -------------------------------------------------------------------------------- 1 | load sma.dat 2 | plot(sma) 3 | legend('Input', 'Output') 4 | title('Moving average output for N = 4') 5 | xlabel('half hour') 6 | ylabel('Number of customers') 7 | xlabel('Half hour') 8 | grid; -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Intro-Moving-Avg.xlg: -------------------------------------------------------------------------------- 1 | 2 | This is cwTeX preprocessor, version . 3 | **Intro-Moving-Avg 4 | (Intro-Moving-Avg.ctx [100] [200] [300] [400] [425]) 5 | Output written on Intro-Moving-Avg.tex & cinput.tex. 6 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/build: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cwtex Intro-Moving-Avg 3 | latex Intro-Moving-Avg 4 | echo '' 5 | echo '' 6 | echo '' 7 | latex Intro-Moving-Avg 8 | dvips Intro-Moving-Avg.dvi 9 | ps2pdf Intro-Moving-Avg.ps 10 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/DC-Blocker-1.tex~: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | \begin{pspicture} 3 | 4 | \end{pspicture} 5 | \end{center} 6 | %%% Local Variables: 7 | %%% mode: latex 8 | %%% TeX-master: "Intro-Moving-Avg" 9 | %%% End: 10 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/sma.m: -------------------------------------------------------------------------------- 1 | load sma.dat; 2 | figure; 3 | plot(sma); 4 | legend('Input', 'Output'); 5 | title('Moving average output for N = 4'); 6 | xlabel('half hour'); 7 | ylabel('Number of customers'); 8 | xlabel('Half hour'); 9 | grid; -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/DC-Blocker-1.tex: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | \begin{pspicture}(10,10) 3 | 4 | \end{pspicture} 5 | \end{center} 6 | %%% Local Variables: 7 | %%% mode: latex 8 | %%% TeX-master: "Intro-Moving-Avg" 9 | %%% End: 10 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/sma.dat: -------------------------------------------------------------------------------- 1 | 0.00 0.00 2 | 0.00 0.00 3 | 0.00 0.00 4 | 0.00 0.00 5 | 10.00 2.50 6 | 20.00 7.50 7 | 30.00 15.00 8 | 35.00 23.75 9 | 20.00 26.25 10 | 10.00 23.75 11 | 5.00 17.50 12 | 0.00 8.75 13 | 0.00 3.75 14 | 0.00 1.25 15 | 0.00 0.00 16 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Intro-Moving-Avg.tex~: -------------------------------------------------------------------------------- 1 | \documentclass{article} 2 | \usepackage{pstricks} 3 | \usepackage{pst-node} 4 | \begin{document} 5 | 6 | \end{document} 7 | 8 | %%% Local Variables: 9 | %%% mode: latex 10 | %%% TeX-master: t 11 | %%% End: 12 | -------------------------------------------------------------------------------- /source/header.htm: -------------------------------------------------------------------------------- 1 |
2 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

3 |
4 |
5 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/missfont.log: -------------------------------------------------------------------------------- 1 | mktexpk --mfmode ljfour --bdpi 600 --mag 1+489/600 --dpi 1089 ctxfm6 2 | mktexpk --mfmode ljfour --bdpi 600 --mag 1+489/600 --dpi 1089 ctxfm6 3 | mktexpk --mfmode ljfour --bdpi 600 --mag 1+489/600 --dpi 1089 ctxfm6 4 | mktextfm ctxfb2 5 | mktextfm ctxfb2 6 | -------------------------------------------------------------------------------- /source/footer.htm: -------------------------------------------------------------------------------- 1 |
2 | 5 | -------------------------------------------------------------------------------- /source/science1.md: -------------------------------------------------------------------------------- 1 | ## 電子玩具的現況 (作者:陳鍾誠) 2 | 3 | 4 | 5 | ### 參考文獻 6 | * [感測積木 換個組合變新儀器](http://mag.udn.com/mag/edu/storypage.jsp?f_ART_ID=486682) , 2013/11/21【聯合晚報╱記者嚴文廷╱台北報導】。 7 | 8 | 9 | 【本文由陳鍾誠取材並修改自 [維基百科] 與 OpenStax College 的 [College Physics] 一書,採用創作共用的 [姓名標示、相同方式分享] 授權】 10 | 11 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/ExpAvgZTrans.tex: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | \begin{pspicture}[showgrid](-3,-2)(3,2) 3 | \pscircle[linecolor=gray](0,0){1} 4 | \pspole(0.8,0){z1} 5 | \nput{0}{z1}{(1 - $\alpha$,0)} 6 | \end{pspicture} 7 | \end{center} 8 | %%% Local Variables: 9 | %%% mode: latex 10 | %%% TeX-master: nil 11 | %%% End: 12 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-Figure.tex: -------------------------------------------------------------------------------- 1 | \documentclass{article} 2 | \usepackage{pstricks} 3 | \usepackage{pst-sigsys} 4 | \begin{document} 5 | 6 | 7 | 8 | \include{MA-Type1} 9 | 10 | %\include{MA-Type1-z-trans} 11 | \end{document} 12 | 13 | %%% Local Variables: 14 | %%% mode: latex 15 | %%% TeX-master: t 16 | %%% End: 17 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-Figure.tex~: -------------------------------------------------------------------------------- 1 | \documentclass{article} 2 | \usepackage{pstricks} 3 | \usepackage{pst-sigsys} 4 | \begin{document} 5 | 6 | 7 | 8 | %\include{MA-Type1} 9 | 10 | \include{MA-Type1-z-trans} 11 | \end{document} 12 | 13 | %%% Local Variables: 14 | %%% mode: latex 15 | %%% TeX-master: t 16 | %%% End: 17 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/ExpAvgZTrans.tex~: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | \begin{pspicture}[showgrid](-2,-2)(2,2) 3 | \pscircle[linecolor=gray](0,0){1} 4 | \pspole(0.8,0){z1} 5 | \nput{0}{z1}{(1 - $\alpha$,0)} 6 | \end{pspicture} 7 | \end{center} 8 | %%% Local Variables: 9 | %%% mode: latex 10 | %%% TeX-master: nil 11 | %%% End: 12 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-ztrans-Figure.tex: -------------------------------------------------------------------------------- 1 | \documentclass{article} 2 | \usepackage{pstricks} 3 | \usepackage{pst-sigsys} 4 | \begin{document} 5 | 6 | 7 | 8 | %\include{MA-Type1} 9 | 10 | \include{MA-Type1-z-trans} 11 | \end{document} 12 | 13 | %%% Local Variables: 14 | %%% mode: latex 15 | %%% TeX-master: t 16 | %%% End: 17 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/MA-Type1-z-trans.tex~: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | \begin{pspicture}[showgrid](-2,-2)(2,2) 3 | \pscircle[linecolor=gray](0,0){1} 4 | \pspole(0.9375,0){z1} 5 | \nput{0}{z1}{$(\frac{15}{16},0)$} 6 | \end{pspicture} 7 | \end{center} 8 | %%% Local Variables: 9 | %%% mode: latex 10 | %%% TeX-master: nil 11 | %%% End: 12 | -------------------------------------------------------------------------------- /source/license.md: -------------------------------------------------------------------------------- 1 | ## 授權聲明 2 | 3 | 本雜誌採用 創作共用:[姓名標示、相同方式分享] 授權,若您想要修改本書產生衍生著作時,至少應該遵守下列授權條件: 4 | 5 | 1. 標示原作者姓名 6 | 3. 採用 創作共用:[姓名標示、相同方式分享] 的方式公開衍生著作。 7 | 8 | 另外、當本雜誌中有文章或素材並非採用 [姓名標示、相同方式分享] 時,將會在該文章或素材後面標示其授權,此時該文章將以該標示的方式授權釋出,請修改者注意這些授權標示,以避免產生侵權糾紛。 9 | 10 | 例如有些文章可能不希望被作為「商業性使用」,此時就可能會採用創作共用:[姓名標示、非商業性、相同方式分享] 的授權,此時您就不應當將該文章用於商業用途上。 11 | 12 | 最後、懇請勿移除公益捐贈的相關描述,以便讓愛心得以持續散播! 13 | 14 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Fibonacci.tex: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | \begin{pspicture}[showgrid](-3,-2)(3,2) 3 | \pscircle[linecolor=gray](0,0){1} 4 | %\pspole(0.9375,0){z1} 5 | \pspole(0.5,-1.118){z0} 6 | \pspole(1.118,0.5){z1} 7 | %\nput{0}{z1}{$(\frac{15}{16},0)$} 8 | \nput{0}{z0}{$(\frac{1}{2},-\frac{\sqrt{5}}{2})$} 9 | \nput{0}{z1}{$(\frac{\sqrt{5}}{2}, \frac{1}{2})$} 10 | \end{pspicture} 11 | \end{center} 12 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Fibonacci.tex~: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | \begin{pspicture}[showgrid](-3,-2)(3,2) 3 | \pscircle[linecolor=gray](0,0){1} 4 | %\pspole(0.9375,0){z1} 5 | \pszero(0,1){z0} 6 | \pszero(-1,0){z1} 7 | \pszero(0,-1){z2} 8 | %\nput{0}{z1}{$(\frac{15}{16},0)$} 9 | \nput{90}{z0}{$(0,1)$} 10 | \nput{180}{z1}{$(-1,0)$} 11 | \nput{270}{z2}{$(0,-1)$} 12 | \end{pspicture} 13 | \end{center} 14 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/MA-Type1-z-trans.tex: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | \begin{pspicture}[showgrid](-3,-2)(3,2) 3 | \pscircle[linecolor=gray](0,0){1} 4 | %\pspole(0.9375,0){z1} 5 | \pszero(0,1){z0} 6 | \pszero(-1,0){z1} 7 | \pszero(0,-1){z2} 8 | %\nput{0}{z1}{$(\frac{15}{16},0)$} 9 | \nput{90}{z0}{$(0,1)$} 10 | \nput{180}{z1}{$(-1,0)$} 11 | \nput{270}{z2}{$(0,-1)$} 12 | \end{pspicture} 13 | \end{center} 14 | %%% Local Variables: 15 | %%% mode: latex 16 | %%% TeX-master: nil 17 | %%% End: 18 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/MA-Type1.aux: -------------------------------------------------------------------------------- 1 | \relax 2 | \@setckpt{MA-Type1}{ 3 | \setcounter{page}{2} 4 | \setcounter{equation}{0} 5 | \setcounter{enumi}{0} 6 | \setcounter{enumii}{0} 7 | \setcounter{enumiii}{0} 8 | \setcounter{enumiv}{0} 9 | \setcounter{footnote}{0} 10 | \setcounter{mpfootnote}{0} 11 | \setcounter{part}{0} 12 | \setcounter{section}{0} 13 | \setcounter{subsection}{0} 14 | \setcounter{subsubsection}{0} 15 | \setcounter{paragraph}{0} 16 | \setcounter{subparagraph}{0} 17 | \setcounter{figure}{0} 18 | \setcounter{table}{0} 19 | } 20 | -------------------------------------------------------------------------------- /code/mcu0m.hex: -------------------------------------------------------------------------------- 1 | 00 16 // 00 LOOP: LD I 2 | 40 1A // 02 CMP N 3 | 50 12 // 04 JEQ EXIT 4 | 10 18 // 06 ADD K1 5 | 30 16 // 08 ST I 6 | 00 14 // 0A LD SUM 7 | 10 16 // 0C ADD I 8 | 30 14 // 0E ST SUM 9 | 20 00 // 10 JMP LOOP 10 | 20 12 // 12 EXIT: JMP EXIT 11 | 00 00 // 14 SUM: WORD 0 12 | 00 00 // 16 I: WORD 0 13 | 00 01 // 18 K1: WORD 1 14 | 00 0A // 1A N: WORD 10 -------------------------------------------------------------------------------- /source/reflink.md9: -------------------------------------------------------------------------------- 1 | [程式人雜誌社團]: https://www.facebook.com/groups/programmerMagazine/ 2 | [科學玩具實驗室]:https://www.facebook.com/groups/sciencetoy/ 3 | [姓名標示、相同方式分享]: http://creativecommons.org/licenses/by-sa/3.0/tw/ 4 | [姓名標示、非商業性、相同方式分享]: http://creativecommons.org/licenses/by-nc-sa/3.0/tw/ 5 | [馬萬圳]: http://coopermaa2nd.blogspot.tw/ 6 | [陳鍾誠]: http://ccckmit.wikidot.com/ 7 | [雜誌訂閱]: https://docs.google.com/spreadsheet/viewform?fromEmail=true&formkey=dG1TcER6Q3h1ZkpacFpDeEVFTDBLeVE6MQ 8 | [College Physics]:http://openstaxcollege.org/textbooks/college-physics 9 | [維基百科]:http://zh.wikipedia.org/ -------------------------------------------------------------------------------- /source/editor.md: -------------------------------------------------------------------------------- 1 | ## 編輯小語 2 | 3 | 在本期的「程式人雜誌」中,聚焦的一個主題是「電子玩具」,像是樂高 MindStorm、電子積木等等,甚至像 Arduino 與 4 | Raspberry Pi 等我也認為可以變成玩具,我認為這類的玩具的開發空間還很大,像是學習有線無線通訊的玩具到目前為止 5 | 我就還找不到,自己動手用 Arduino 與 Raspberry Pi 做四軸飛行器等也可以算是某種玩具。 6 | 7 | 目前、3D 印表受到了很大的注意、但事實上像是 FPGA 、電路板雕刻機與電路印表機等技術也正在發展當中,未來或許 8 | 真的有機會將「工廠搬回家」,在家生產電子玩具的原型也說不定。而像麵包板、手動焊接等傳統方法也是可以訓練 9 | 電路知識的好方法,加上電腦軟體模擬的技術,像是 Spice 與 Verilog 之類的軟體設計模擬方式之後,筆者相信可以整合 10 | 一套很好的電子教學方法,讓小孩也能輕易的學會這些專業知識的。 11 | 12 | 在程式人文集當中,雖然「 R 統計軟體與 JavaScript 系列」暫時結束了,但是我們將加入像「C 語言秘技」等系列文章, 13 | 祝大家閱讀愉快。 14 | 15 | ---- (程式人雜誌編輯 - 陳鍾誠) 16 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/MA-IIR-ztrans.tex: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | \begin{pspicture}[showgrid](-3,-2)(3,2) 3 | \pscircle[linecolor=gray](0,0){1} 4 | %\pspole(0.9375,0){z1} 5 | \pszero(0,1){z0} 6 | \pszero(-1,0){z1} 7 | \pszero(0,-1){z2} 8 | \pszero(1,0){z3} 9 | \pspole(1,0){z3} 10 | %\nput{0}{z1}{$(\frac{15}{16},0)$} 11 | \nput{90}{z0}{$(0,1)$} 12 | \nput{180}{z1}{$(-1,0)$} 13 | \nput{270}{z2}{$(0,-1)$} 14 | \nput{0}{z3}{mutually canceled pole/zero pair} 15 | \end{pspicture} 16 | \end{center} 17 | 18 | 19 | %%% Local Variables: 20 | %%% mode: latex 21 | %%% TeX-master: t 22 | %%% End: 23 | -------------------------------------------------------------------------------- /source/messageGPGPU.md: -------------------------------------------------------------------------------- 1 | ## 硬體短訊:電路印刷技術 2 | 3 | * [科學家開發《墨水列印電路板》 只要一台印表機就搞定](http://news.gamme.com.tw/605500) 4 | * [EX1 是一台神奇的印表機,可以將電路直接列印在紙張、布料上](http://chinese.engadget.com/2013/11/13/ex1-prints-circuits-on-paper-cloth-almost-anything-you-can-ima/) 5 | 6 | 7 | ### 參考文獻 8 | * 9 | * 維基百科:[科納斯組織](http://zh.wikipedia.org/wiki/%E7%A7%91%E7%BA%B3%E6%96%AF%E7%BB%84%E7%BB%87) 10 | * Wikipedia:[GPGPU](http://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processing_units) 11 | * [圖形處理計算之外,GPGPU興起](http://www.ithome.com.tw/itadm/article.php?c=77728), 文/王建興 (清華資工所博士班研究生) 2012-12-13. 12 | 13 | 【本文由陳鍾誠取材並修改自 [維基百科] ,採用創作共用的 [姓名標示、相同方式分享] 授權】 14 | 15 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/sma.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | string = '& 0 & 0 & 0 & 0 & 10 & 20 & 30 & 35 & 20 & 10 & 5 & 0 & 0 & 0 & 0' 4 | 5 | str_numbers = string.split('&') 6 | numbers = [int(str) for str in str_numbers if str <> ''] 7 | 8 | N = 4 9 | delay_line = [0,0,0,0] 10 | output_seq = [] 11 | for num in numbers: 12 | delay_line.append(num) 13 | del delay_line[0] 14 | output_seq.append(sum(delay_line) / float(N)) 15 | 16 | print '%r' % output_seq 17 | output_str = [] 18 | for output in output_seq: 19 | output_str.append('%4.2f' % output) 20 | 21 | print ' & '.join(output_str) 22 | 23 | f = open('sma.dat', 'w') 24 | for input,output in zip(numbers, output_seq): 25 | f.write('%4.2f %4.2f\n' % (input, output)) 26 | f.close() 27 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Fibonacci.aux: -------------------------------------------------------------------------------- 1 | \relax 2 | \@setckpt{Fibonacci}{ 3 | \setcounter{page}{11} 4 | \setcounter{equation}{10} 5 | \setcounter{enumi}{0} 6 | \setcounter{enumii}{0} 7 | \setcounter{enumiii}{0} 8 | \setcounter{enumiv}{0} 9 | \setcounter{footnote}{3} 10 | \setcounter{mpfootnote}{0} 11 | \setcounter{part}{0} 12 | \setcounter{section}{3} 13 | \setcounter{subsection}{0} 14 | \setcounter{subsubsection}{0} 15 | \setcounter{paragraph}{0} 16 | \setcounter{subparagraph}{0} 17 | \setcounter{figure}{10} 18 | \setcounter{table}{1} 19 | \setcounter{ContinuedFloat}{0} 20 | \setcounter{KVtest}{0} 21 | \setcounter{subfigure}{0} 22 | \setcounter{subfigure@save}{2} 23 | \setcounter{lofdepth}{1} 24 | \setcounter{subtable}{0} 25 | \setcounter{subtable@save}{0} 26 | \setcounter{lotdepth}{1} 27 | } 28 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/ExpAvgTimeEqn.aux: -------------------------------------------------------------------------------- 1 | \relax 2 | \@setckpt{ExpAvgTimeEqn}{ 3 | \setcounter{page}{8} 4 | \setcounter{equation}{10} 5 | \setcounter{enumi}{0} 6 | \setcounter{enumii}{0} 7 | \setcounter{enumiii}{0} 8 | \setcounter{enumiv}{0} 9 | \setcounter{footnote}{3} 10 | \setcounter{mpfootnote}{0} 11 | \setcounter{part}{0} 12 | \setcounter{section}{2} 13 | \setcounter{subsection}{0} 14 | \setcounter{subsubsection}{0} 15 | \setcounter{paragraph}{0} 16 | \setcounter{subparagraph}{0} 17 | \setcounter{figure}{6} 18 | \setcounter{table}{1} 19 | \setcounter{ContinuedFloat}{0} 20 | \setcounter{KVtest}{0} 21 | \setcounter{subfigure}{0} 22 | \setcounter{subfigure@save}{0} 23 | \setcounter{lofdepth}{1} 24 | \setcounter{subtable}{0} 25 | \setcounter{subtable@save}{0} 26 | \setcounter{lotdepth}{1} 27 | } 28 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/ExpAvgZTrans.aux: -------------------------------------------------------------------------------- 1 | \relax 2 | \@setckpt{ExpAvgZTrans}{ 3 | \setcounter{page}{8} 4 | \setcounter{equation}{10} 5 | \setcounter{enumi}{0} 6 | \setcounter{enumii}{0} 7 | \setcounter{enumiii}{0} 8 | \setcounter{enumiv}{0} 9 | \setcounter{footnote}{3} 10 | \setcounter{mpfootnote}{0} 11 | \setcounter{part}{0} 12 | \setcounter{section}{2} 13 | \setcounter{subsection}{0} 14 | \setcounter{subsubsection}{0} 15 | \setcounter{paragraph}{0} 16 | \setcounter{subparagraph}{0} 17 | \setcounter{figure}{7} 18 | \setcounter{table}{1} 19 | \setcounter{ContinuedFloat}{0} 20 | \setcounter{KVtest}{0} 21 | \setcounter{subfigure}{0} 22 | \setcounter{subfigure@save}{0} 23 | \setcounter{lofdepth}{1} 24 | \setcounter{subtable}{0} 25 | \setcounter{subtable@save}{0} 26 | \setcounter{lotdepth}{1} 27 | } 28 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/MA-IIR-ztrans.aux: -------------------------------------------------------------------------------- 1 | \relax 2 | \@setckpt{MA-IIR-ztrans}{ 3 | \setcounter{page}{8} 4 | \setcounter{equation}{8} 5 | \setcounter{enumi}{0} 6 | \setcounter{enumii}{0} 7 | \setcounter{enumiii}{0} 8 | \setcounter{enumiv}{0} 9 | \setcounter{footnote}{3} 10 | \setcounter{mpfootnote}{0} 11 | \setcounter{part}{0} 12 | \setcounter{section}{2} 13 | \setcounter{subsection}{0} 14 | \setcounter{subsubsection}{0} 15 | \setcounter{paragraph}{0} 16 | \setcounter{subparagraph}{0} 17 | \setcounter{figure}{5} 18 | \setcounter{table}{1} 19 | \setcounter{ContinuedFloat}{0} 20 | \setcounter{KVtest}{0} 21 | \setcounter{subfigure}{0} 22 | \setcounter{subfigure@save}{0} 23 | \setcounter{lofdepth}{1} 24 | \setcounter{subtable}{0} 25 | \setcounter{subtable@save}{0} 26 | \setcounter{lotdepth}{1} 27 | } 28 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/MA-Type1-z-trans.aux: -------------------------------------------------------------------------------- 1 | \relax 2 | \@setckpt{MA-Type1-z-trans}{ 3 | \setcounter{page}{4} 4 | \setcounter{equation}{4} 5 | \setcounter{enumi}{0} 6 | \setcounter{enumii}{0} 7 | \setcounter{enumiii}{0} 8 | \setcounter{enumiv}{0} 9 | \setcounter{footnote}{3} 10 | \setcounter{mpfootnote}{0} 11 | \setcounter{part}{0} 12 | \setcounter{section}{2} 13 | \setcounter{subsection}{0} 14 | \setcounter{subsubsection}{0} 15 | \setcounter{paragraph}{0} 16 | \setcounter{subparagraph}{0} 17 | \setcounter{figure}{1} 18 | \setcounter{table}{1} 19 | \setcounter{ContinuedFloat}{0} 20 | \setcounter{KVtest}{0} 21 | \setcounter{subfigure}{0} 22 | \setcounter{subfigure@save}{0} 23 | \setcounter{lofdepth}{1} 24 | \setcounter{subtable}{0} 25 | \setcounter{subtable@save}{0} 26 | \setcounter{lotdepth}{1} 27 | } 28 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/MA-Type1.tex~: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | % To describe y(n) = (15/16)*y(n-1) + (1/16)*x(n) 3 | \begin{pspicture}(-2,-1)(10,2) 4 | \pssignal(0,1){x}{$x(n)$} 5 | % \pscircleop[oplength=0.25,operation=times](2,1){op1} 6 | \pssignal(2,0){coefx}{$\frac{1}{16}$} 7 | \pscircleop[oplength=0.25](4,1){op2} 8 | \pssignal(8,1){y}{$y(n)$} 9 | \dotnode(6,1){ydot} 10 | \psblock(6,0){delay}{$z^{-1}$} 11 | \pscircleop[oplength=0.25,operation=times](4,0){op3} 12 | \pssignal(3,0){coefy}{$\frac{15}{16}$} 13 | \nclist{->}{ncline}{x,op1,op2,y} 14 | \nclist{->}{ncline}{coefx,op1} 15 | \nclist{->}{ncline}{ydot,delay,op3,op2} 16 | \nclist{->}{ncline}{coefy,op3} 17 | \end{pspicture} 18 | \end{center} 19 | %%% Local Variables: 20 | %%% mode: latex 21 | %%% TeX-master: t 22 | %%% End: 23 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/ExpAvg-Alpha-1over16.tex: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | % To describe y(n) = (15/16)*y(n-1) + (1/16)*x(n) 3 | \begin{pspicture}(-2,-1)(10,2) 4 | \pssignal(0,1){x}{$x(n)$} 5 | \pscircleop[oplength=0.25,operation=times](2,1){op1} 6 | \pssignal(2,0){coefx}{$\frac{1}{16}$} 7 | \pscircleop[oplength=0.25](4,1){op2} 8 | \pssignal(8,1){y}{$y(n)$} 9 | \dotnode(6,1){ydot} 10 | \psblock(6,0){delay}{$z^{-1}$} 11 | \pscircleop[oplength=0.25,operation=times](4,0){op3} 12 | \pssignal(3,0){coefy}{$\frac{15}{16}$} 13 | \nclist{->}{ncline}{x,op1,op2,y} 14 | \nclist{->}{ncline}{coefx,op1} 15 | \nclist{->}{ncline}{ydot,delay,op3,op2} 16 | \nclist{->}{ncline}{coefy,op3} 17 | \end{pspicture} 18 | \end{center} 19 | %%% Local Variables: 20 | %%% mode: latex 21 | %%% TeX-master: t 22 | %%% End: 23 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/ExpAvgTimeEqn.tex: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | % To describe y(n) = (1-alpha)*y(n-1) + alpha*x(n) 3 | \begin{pspicture}(-2,-1)(10,2) 4 | \pssignal(0,1){x}{$x(n)$} 5 | \pscircleop[oplength=0.25,operation=times](2,1){op1} 6 | %\pssignal(2,0){coefx}{$\frac{1}{16}$} 7 | \pssignal(2,0){coefx}{$\alpha$} 8 | \pscircleop[oplength=0.25](4,1){op2} 9 | \pssignal(8,1){y}{$y(n)$} 10 | \dotnode(6,1){ydot} 11 | \psblock(6,0){delay}{$z^{-1}$} 12 | \pscircleop[oplength=0.25,operation=times](4,0){op3} 13 | %\pssignal(3,0){coefy}{$\frac{15}{16}$} 14 | \pssignal(4,-1){coefy}{$1 - \alpha$} 15 | \nclist{->}{ncline}{x,op1,op2,y} 16 | \nclist{->}{ncline}{coefx,op1} 17 | \nclist{->}{ncline}{ydot,delay,op3,op2} 18 | \nclist{->}{ncline}{coefy,op3} 19 | \end{pspicture} 20 | \end{center} 21 | %%% Local Variables: 22 | %%% mode: latex 23 | %%% TeX-master: t 24 | %%% End: 25 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/ExpAvgTimeEqn.tex~: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | % To describe y(n) = (1-alpha)*y(n-1) + alpha*x(n) 3 | \begin{pspicture}(-2,-1)(10,2) 4 | \pssignal(0,1){x}{$x(n)$} 5 | \pscircleop[oplength=0.25,operation=times](2,1){op1} 6 | %\pssignal(2,0){coefx}{$\frac{1}{16}$} 7 | \pssignal(2,0){coefx}{$\alpha$} 8 | \pscircleop[oplength=0.25](4,1){op2} 9 | \pssignal(8,1){y}{$y(n)$} 10 | \dotnode(6,1){ydot} 11 | \psblock(6,0){delay}{$z^{-1}$} 12 | \pscircleop[oplength=0.25,operation=times](4,0){op3} 13 | %\pssignal(3,0){coefy}{$\frac{15}{16}$} 14 | \pssignal(3,0){coefy}{$1 - \alpha$} 15 | \nclist{->}{ncline}{x,op1,op2,y} 16 | \nclist{->}{ncline}{coefx,op1} 17 | \nclist{->}{ncline}{ydot,delay,op3,op2} 18 | \nclist{->}{ncline}{coefy,op3} 19 | \end{pspicture} 20 | \end{center} 21 | %%% Local Variables: 22 | %%% mode: latex 23 | %%% TeX-master: t 24 | %%% End: 25 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/MA-Type1.tex: -------------------------------------------------------------------------------- 1 | \begin{center} 2 | % To describe y(n) = ( x(n) + x(n-1) + x(n-2) + x(n-3) ) / 4 3 | \begin{pspicture}(-2,-1)(10,2) 4 | \pssignal(0,1){x}{$x(n)$} 5 | \psblock(1,1){d1}{$z^{-1}$} 6 | \psblock(2,1){d2}{$z^{-1}$} 7 | \psblock(3,1){d3}{$z^{-1}$} 8 | 9 | % \pscircleop[oplength=0.25,operation=times](2,1){op1} 10 | \pssignal(2,0){coefx}{$\frac{1}{16}$} 11 | \pscircleop[oplength=0.25](4,1){op2} 12 | \pssignal(8,1){y}{$y(n)$} 13 | \dotnode(6,1){ydot} 14 | \psblock(6,0){delay}{$z^{-1}$} 15 | \pscircleop[oplength=0.25,operation=times](4,0){op3} 16 | \pssignal(3,0){coefy}{$\frac{15}{16}$} 17 | \nclist{->}{ncline}{x,op1,op2,y} 18 | \nclist{->}{ncline}{coefx,op1} 19 | \nclist{->}{ncline}{ydot,delay,op3,op2} 20 | \nclist{->}{ncline}{coefy,op3} 21 | \end{pspicture} 22 | \end{center} 23 | %%% Local Variables: 24 | %%% mode: latex 25 | %%% TeX-master: t 26 | %%% End: 27 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/exp-avg.py: -------------------------------------------------------------------------------- 1 | class expAvg(object): 2 | def __init__(self, alpha): 3 | self.alpha = alpha 4 | self.y_D = 0.0 5 | def input(self, input): 6 | y = self.alpha * input + (1-self.alpha) * self.y_D 7 | self.y_D = y 8 | return y 9 | 10 | avg2 = expAvg(0.2) 11 | avg4 = expAvg(0.4) 12 | avg6 = expAvg(0.6) 13 | avg8 = expAvg(0.8) 14 | 15 | Avg2Seq = [] 16 | Avg4Seq = [] 17 | Avg6Seq = [] 18 | Avg8Seq = [] 19 | InputSeq = [] 20 | 21 | f = open('avg_exp.dat', 'w') 22 | for i in range(100): 23 | input = 10.0 if i > 6 else 0.0 24 | avg2_y = avg2.input(input) 25 | avg4_y = avg4.input(input) 26 | avg6_y = avg6.input(input) 27 | avg8_y = avg8.input(input) 28 | 29 | f.write('%8.7f %8.7f %8.7f %8.7f %8.7f\n' % (input, avg2_y, avg4_y, avg6_y, avg8_y)) 30 | 31 | Avg2Seq.append(avg2_y) 32 | Avg4Seq.append(avg4_y) 33 | Avg6Seq.append(avg6_y) 34 | Avg8Seq.append(avg8_y) 35 | 36 | f.close() 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /htm/article.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |

# 程式人文集

17 |
18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /htm/message.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |

# 程式人短訊

17 |
18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /htm/people.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |

# 人物速寫

17 |
18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /htm/video.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |

# 影音頻道

17 |
18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/cinput.tex: -------------------------------------------------------------------------------- 1 | \providecommand{\z}{\hskip 0.0pt plus0.2pt minus0.1pt} 2 | \providecommand{\Z}{\hskip 1.2pt plus0.4pt minus0.2pt} 3 | \providecommand{\zZ}{\hskip 3.6pt plus1.2pt minus0.8pt} 4 | \providecommand{\cH}{\char} 5 | \providecommand{\McQ}{\fontfamily{cwM}\fontseries{2}\selectfont} 6 | \providecommand{\MaQ}{\fontfamily{cwM}\fontseries{0}\selectfont} 7 | \providecommand{\MgQ}{\fontfamily{cwM}\fontseries{6}\selectfont} 8 | \providecommand{\MbQ}{\fontfamily{cwM}\fontseries{1}\selectfont} 9 | \providecommand{\MrQ}{\fontfamily{cwM}\fontseries{17}\selectfont} 10 | \providecommand{\MdQ}{\fontfamily{cwM}\fontseries{3}\selectfont} 11 | \providecommand{\MiQ}{\fontfamily{cwM}\fontseries{8}\selectfont} 12 | \providecommand{\MjQ}{\fontfamily{cwM}\fontseries{9}\selectfont} 13 | \providecommand{\MhQ}{\fontfamily{cwM}\fontseries{7}\selectfont} 14 | \providecommand{\MeQ}{\fontfamily{cwM}\fontseries{4}\selectfont} 15 | \providecommand{\MfQ}{\fontfamily{cwM}\fontseries{5}\selectfont} 16 | \providecommand{\MkQ}{\fontfamily{cwM}\fontseries{10}\selectfont} 17 | \providecommand{\MoQ}{\fontfamily{cwM}\fontseries{14}\selectfont} 18 | \providecommand{\MpQ}{\fontfamily{cwM}\fontseries{15}\selectfont} 19 | -------------------------------------------------------------------------------- /htm/preface.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

前言

22 |
23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /htm/science.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

程式與科學

22 |
23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /htm/discuss.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

程式人討論區

22 |
23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /htm/message3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |

國立成功大學全國中小學科普教育生根計畫:夏令研習營 -- 2013夏令研習營

17 | 20 |
21 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /source/video1.md: -------------------------------------------------------------------------------- 1 | ## 看影片瞭解電玩遊戲的起源與歷史 2 | 3 | 對於台灣的五年級 (民國 50 年代出生) 的朋友們而言,可能很多人都玩過那種小型的掌上遊戲機, 4 | 但是大部分的人可能不瞭解這類電動遊戲的歷史,以下的影片用較通俗的方式介紹了電玩的歷史。 5 | 6 | | History of Video Games | 內容簡介 | 連結 | 7 | |--------|----------|------| 8 | | 前言 | Making of | | 9 | | 第 1 集 | steve russell, computer space, spacewar | | 10 | | 第 2 集 | Magnavox Odyssey Ralph Baer | | 11 | | 第 2B 集 | Magnavox Odyssey Light Rifle Gun | | 12 | | 第 3 集 | PONG, Space Race, Gotcha, Gran Trak 10 | | 13 | | 第 4 集 | steve russell, computer space, spacewar | | 14 | 15 | ![圖、第一個進入生活領域的 Pong 電玩遊戲](../img/Pong.jpg) 16 | 17 | 看到上面的「乒乓球」遊戲,真的讓我想起很小的時候,曾經看過且玩過這樣的遊戲機,而後來的「小蜜蜂」 18 | 、「小精靈」等遊戲,還曾經造成很多小學生在電動玩具店流連忘返。 19 | 20 | 我記得在我小學一年級左右,台灣街頭巷尾都有人在店裏擺上一台電動機台,小孩投兩塊錢好像就可以玩一次, 21 | 那時候我很喜歡玩「小精靈、小蜜蜂」之類的遊戲,可惜功力太差,常常不到兩分鐘就掛了。 22 | 23 | 但是我的大哥後來練到功力很好,結果怎麼打都不會掛,還常常引起一堆人在旁圍觀,一打就是一個小時, 24 | 結果 .... ,我的老爸聞風而來,把他給捉回去,然後就禁止他打電動了。 25 | 26 | 而我、則是因為功力太差,反而逃過一劫 ... 27 | 28 | ### 參考文獻 29 | * [電子遊戲歷史](http://zh.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E9%81%8A%E6%88%B2%E6%AD%B7%E5%8F%B2) 30 | * [History of video games](http://en.wikipedia.org/wiki/History_of_video_games) 31 | 32 | 【本文由陳鍾誠取材並修改自 [維基百科],採用創作共用的 [姓名標示、相同方式分享] 授權】 33 | -------------------------------------------------------------------------------- /htm/title.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 程式人雜誌 9 | 10 | 11 | 12 | 13 |
14 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

15 |
16 |
17 | 22 | 23 |
24 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /source/home.md: -------------------------------------------------------------------------------- 1 | ### 關於程式人雜誌 2 | 3 | 程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌。 4 | 5 | ### 雜誌下載 6 | 7 | 出刊年月 epub ipad:PDF A4:PDF 單頁 HTM 原始碼 8 | ------------ ---------- ----------- -------- ----------- ---------- 9 | 2013年12月 [epub] [ipad.pdf] [A4.pdf] [pmag.html] [code.zip] 10 | 11 | ### 本期內容 12 | * 前言 13 | * [編輯小語](editor.html) 14 | * [授權聲明](license.html) 15 | * 人物速寫 16 | * [Atari 的創辦人 - Nolan Key Bushnell](people1.html) 17 | * [電子積木發明人 - 王文渭 老先生](people2.html) 18 | * 程式人短訊 19 | * [歷史短訊:電玩遊戲的歷史](message1.html) 20 | * [硬體短訊:把工廠搬入家庭的「原型製作」技術](message2.html) 21 | * 影音頻道 22 | * [看影片瞭解電玩遊戲的起源與歷史](video1.html) 23 | * 程式人文集 24 | * [Arduino入門教學(12) – 使用可變電阻控制伺服馬達 (作者:Cooper Maa)](article1.html) 25 | * [C 語言秘技 (1) – 使用 sscanf 模仿正規表達式的剖析功能 (作者:陳鍾誠)](article2.html) 26 | * [淺談動平均濾波器 (作者:黃俊傑)](article3.html) 27 | * [Visual Basic 6.0 - 利用 堆疊(Stack) 實作中序轉前序與後序 (作者:廖憲得 0xde)](article4.html) 28 | * [開放電腦計畫 (6) – 一顆只有 51 行 Verilog 程式碼的 16 位元處理器 MCU0 (作者:陳鍾誠)](article5.html) 29 | * [R 講題分享 - 種類數的估計與預測 (作者:Taiwan R User Group)](article6.html) 30 | * [雜誌訊息](info.html) 31 | 32 | ### 雜誌取得 33 | 34 | 程式人雜誌預定於每個月 1 日出刊,您可以從下列網址取得程式人雜誌的所有內容 (包含當月最新出刊的雜誌)。 35 | 36 | * 37 | 38 | ### 連絡我們 39 | 40 | 竭誠歡迎程式人投稿,或者成為本雜誌的專欄作家,現在就可以加入 [程式人雜誌社團] 一同共襄盛舉。 41 | 42 | 本雜誌編輯為「陳鍾誠 (@ccckmit)」,若要聯絡編輯,請寄信到 。 43 | 44 | [epub]: ../book/A4.epub 45 | [ipad.pdf]: ../book/ipad.pdf 46 | [A4.pdf]: ../book/A4.pdf 47 | [code.zip]: ../code.zip 48 | [pmag.html]: ../book/pmag.html 49 | 50 | 51 | -------------------------------------------------------------------------------- /htm/science1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 | 21 |

電子玩具的現況 (作者:陳鍾誠)

22 |

參考文獻

23 | 26 |

【本文由陳鍾誠取材並修改自 維基百科 與 OpenStax College 的 College Physics 一書,採用創作共用的 姓名標示、相同方式分享 授權】

27 |
28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /htm/editor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

編輯小語

22 |

在本期的「程式人雜誌」中,聚焦的一個主題是「電子玩具」,像是樂高 MindStorm、電子積木等等,甚至像 Arduino 與 Raspberry Pi 等我也認為可以變成玩具,我認為這類的玩具的開發空間還很大,像是學習有線無線通訊的玩具到目前為止 我就還找不到,自己動手用 Arduino 與 Raspberry Pi 做四軸飛行器等也可以算是某種玩具。

23 |

目前、3D 印表受到了很大的注意、但事實上像是 FPGA 、電路板雕刻機與電路印表機等技術也正在發展當中,未來或許 真的有機會將「工廠搬回家」,在家生產電子玩具的原型也說不定。而像麵包板、手動焊接等傳統方法也是可以訓練 電路知識的好方法,加上電腦軟體模擬的技術,像是 Spice 與 Verilog 之類的軟體設計模擬方式之後,筆者相信可以整合 一套很好的電子教學方法,讓小孩也能輕易的學會這些專業知識的。

24 |

在程式人文集當中,雖然「 R 統計軟體與 JavaScript 系列」暫時結束了,但是我們將加入像「C 語言秘技」等系列文章, 祝大家閱讀愉快。

25 |

---- (程式人雜誌編輯 - 陳鍾誠)

26 |
27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /code/mcu0m.v: -------------------------------------------------------------------------------- 1 | `define N SW[15] // 負號旗標 2 | `define Z SW[14] // 零旗標 3 | `define OP IR[15:12] // 運算碼 4 | `define C IR[11:0] // 常數欄位 5 | `define M {m[`C], m[`C+1]} 6 | 7 | module cpu(input clock); // CPU0-Mini 的快取版:cpu0mc 模組 8 | parameter [3:0] LD=4'h0,ADD=4'h1,JMP=4'h2,ST=4'h3,CMP=4'h4,JEQ=4'h5; 9 | reg signed [15:0] A; // 宣告暫存器 R[0..15] 等 16 個 32 位元暫存器 10 | reg [15:0] IR; // 指令暫存器 IR 11 | reg [15:0] SW; // 指令暫存器 IR 12 | reg [15:0] PC; // 程式計數器 13 | reg [15:0] pc0; 14 | reg [7:0] m [0:32]; // 內部的快取記憶體 15 | integer i; 16 | initial // 初始化 17 | begin 18 | PC = 0; // 將 PC 設為起動位址 0 19 | SW = 0; 20 | $readmemh("mcu0m.hex", m); 21 | for (i=0; i < 32; i=i+2) begin 22 | $display("%8x: %8x", i, {m[i], m[i+1]}); 23 | end 24 | end 25 | 26 | always @(posedge clock) begin // 在 clock 時脈的正邊緣時觸發 27 | IR = {m[PC], m[PC+1]}; // 指令擷取階段:IR=m[PC], 2 個 Byte 的記憶體 28 | pc0= PC; // 儲存舊的 PC 值在 pc0 中。 29 | PC = PC+2; // 擷取完成,PC 前進到下一個指令位址 30 | case (`OP) // 解碼、根據 OP 執行動作 31 | LD: A = `M; // LD C 32 | ST: `M = A; // ST C 33 | CMP: begin `N=(A < `M); `Z=(A==`M); end // CMP C 34 | ADD: A = A + `M; // ADD C 35 | JMP: PC = `C; // JMP C 36 | JEQ: if (`Z) PC=`C; // JEQ C 37 | endcase 38 | // 印出 PC, IR, SW, A 等暫存器值以供觀察 39 | $display("%4dns PC=%x IR=%x, SW=%x, A=%d", $stime, pc0, IR, SW, A); 40 | end 41 | endmodule 42 | 43 | module main; // 測試程式開始 44 | reg clock; // 時脈 clock 變數 45 | 46 | cpu cpux(clock); // 宣告 cpu0mc 處理器 47 | 48 | initial clock = 0; // 一開始 clock 設定為 0 49 | always #10 clock=~clock; // 每隔 10ns 反相,時脈週期為 20ns 50 | initial #2000 $finish; // 在 2000 奈秒的時候停止測試。 51 | endmodule 52 | -------------------------------------------------------------------------------- /htm/license.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

授權聲明

22 |

本雜誌採用 創作共用:姓名標示、相同方式分享 授權,若您想要修改本書產生衍生著作時,至少應該遵守下列授權條件:

23 |
    24 |
  1. 標示原作者姓名
  2. 25 |
  3. 採用 創作共用:姓名標示、相同方式分享 的方式公開衍生著作。
  4. 26 |
27 |

另外、當本雜誌中有文章或素材並非採用 姓名標示、相同方式分享 時,將會在該文章或素材後面標示其授權,此時該文章將以該標示的方式授權釋出,請修改者注意這些授權標示,以避免產生侵權糾紛。

28 |

例如有些文章可能不希望被作為「商業性使用」,此時就可能會採用創作共用:姓名標示、非商業性、相同方式分享 的授權,此時您就不應當將該文章用於商業用途上。

29 |

最後、懇請勿移除公益捐贈的相關描述,以便讓愛心得以持續散播!

30 |
31 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /source/people2.md: -------------------------------------------------------------------------------- 1 | ## 電子積木發明人 - 王文渭 老先生 2 | 3 | 還記得去年我在萬華萬大路的一家隱身於巷子內的超難找小店裏,買了一盒「電子積木」玩具, 4 | 那盒積木大概就像下列淘寶網電子積木分類下的這些玩具一樣 5 | 6 | * [淘寶網:電子積木](http://search.taobao.com/search?spm=a230r.1.4.7.UfYUZe&q=%B5%E7%D7%D3%BB%FD%C4%BE&rs=up&rsclick=7) 7 | 8 | 但是、由於今年淘寶透過全家便利店直接攻入台灣,現在您應該可以輕鬆的透過「全家取貨」的方式買到這類的東西了。 9 | 10 | * [淘寶網【全家取貨】新上線!](http://www.taobao.com/go/act/global/201310family.php) 11 | 12 | 雖然這樣的電子積木,在技術層次上並不是非常高,但是卻是真正能量產,能夠賣到商場與玩具店的一種教學產品。 13 | 14 | 令人意外的,在中國大陸,這類型的電子積木,卻是由一位王文渭老先生所發明的,以下是節錄自 15 | [互動百科:王文渭](http://www.baike.com/wiki/%E7%8E%8B%E6%96%87%E6%B8%AD) 的一段描述: 16 | 17 | > 1988年,王文渭還是湖北省電業技工學校電子老師,在實際的電子教學過程中,為了讓學生更形像更直觀的了解電子電路,王老師根據多年的實際教學經驗,發明了多用電子電工實驗裝置,專門用於電子電路實驗教學。此方法在老師和學生中大受歡迎。後來此裝置還獲得了國家教育部實驗教學的特等獎。 18 | > 19 | > 1995年,王老師進一步改善了萬用電子積木,並重新申請了專利。於是,一款用於兒童早教、開發智力的兒童玩具終於誕生了。這項發明,在電子玩具領域內,不僅在國內尚屬首例,在國際市場上也是空白! 20 | > 21 | > 1996年,王老師在朋友的介紹來,來到了杭州,此時杭州有兩家企業願意與他合作,王老師終於選擇了其中一家公司,簽訂協議後,成立了杭州科林電子有限公司,主打產品《百變電子圖》。科林公司為了盡快讓這一產品推廣到市場,通過教育部門,在全國範圍內舉辦了中小學生電子競賽。通過這場競賽,百變電子圖終於走進了千家萬戶。在與科林的三年合同期間,百變電子圖為公司帶來了近千萬元的營業額,萬老師也從中獲取了相應的報酬!而王老師的“電子要從娃娃抓起的目標”終於實現了! 22 | > 23 | 24 | 以下是互動百科中有關這種電子積木的介紹: 25 | 26 | * [互動百科:电子积木](http://www.baike.com/wiki/%E7%94%B5%E5%AD%90%E7%A7%AF%E6%9C%A8) 27 | 28 | 另外、大陸也有一些電視節目訪問並介紹了「王文渭」老先生,以下是其中的幾段訪問。 29 | 30 | * [视频: 古稀老人他乡创业---王老师电子积木中国好商机](http://v.youku.com/v_show/id_XNjMzNjMxMTE2.html) 31 | 32 | 關於這些電子積木的玩法,您可以參考下列的影片: 33 | 34 | * [视频: 王老师电子积木采访视频](http://v.youku.com/v_show/id_XNDIwNDk3Mzg4.html) 35 | * [视频: 王老师电子积木19978 9889 迪宝乐电子积木2008](http://v.youku.com/v_show/id_XMjg5ODEzODI0.html) 36 | * [视频: 王老师电子积木335 迪宝乐电子积木668 儿童益智玩具](http://v.youku.com/v_show/id_XMzMxNDEyODM2.html) 37 | 38 | 這樣的玩具讓我想起在我小時候的台灣,有一款玩具叫做「動動腦」,您可以在以下網址看到這種玩具。 39 | 40 | * [分享:兒時的回憶-動動腦聲光科學組合玩具](http://www.mobile01.com/topicdetail.php?f=181&t=258686) 41 | 42 | 我很喜歡像「動動腦」這類的玩具,而且「動動腦」赤裸裸的將「電容、電阻、電感」呈現在小孩的眼前,玩的時後感覺更加有意思, 43 | 只是入門的難度會更高一些,而且對兒童恐怕會有一些安全性的問題。 44 | 45 | 我在想,如果能將 Arduino、Raspberry Pi、與麵包板之類的電子實驗器材,改造成安全性較高的玩具,那應該對小孩會是一個很有 46 | 吸引力的東西,樂高的 NXT MindStorm 就是一個成功的範例,不過如果能夠進一步納入 FPGA 之類的設備,讓小孩也能自行學習 47 | 設計 CPU、甚至是無線收發模組,那我想對激發小孩的學習潛力而言,應該會有很好的效果才對。 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /htm/messageGPGPU.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

硬體短訊:電路印刷技術

22 | 26 |

參考文獻

27 | 33 |

【本文由陳鍾誠取材並修改自 維基百科 ,採用創作共用的 姓名標示、相同方式分享 授權】

34 |
35 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /source/message2.md: -------------------------------------------------------------------------------- 1 | ## 硬體短訊:把工廠搬入家庭的「原型製作」技術 2 | 3 | 最近兩年在 3D 印表機的帶頭之下,興起了一個 Maker 熱潮,雖然 3D 印表已經存在了幾十年了, 4 | 但是這類的技術最近激起了很多人的希望,或許有機會可以將不少原本只有在工廠可以做出來的東西 5 | 搬回家裏做也說不定。 6 | 7 | 以下我們將介紹一些類似 3D 印表機的原型技術,這些技術很多都還在發展當中,尚未真正的商品化, 8 | 但有些卻是已經很成熟的老掉牙技術了,不過一但這些技術成功的進入家庭,都會對 Maker 運動產生 9 | 正面的影響。 10 | 11 | ### 電路印表機 12 | 13 | 電路印表機是一種可以印出電路的機器,據說這種印表機的成本相當的便宜,大約台幣一萬元左右而已, 14 | 而且一分鐘之內就可以印出一張電路。 15 | 16 | * [科學家開發《墨水列印電路板》 只要一台印表機就搞定](http://news.gamme.com.tw/605500) 17 | * [EX1 是一台神奇的印表機,可以將電路直接列印在紙張、布料上](http://chinese.engadget.com/2013/11/13/ex1-prints-circuits-on-paper-cloth-almost-anything-you-can-ima/) 18 | * [The EX¹ - rapid 3D printing of circuit boards](http://www.kickstarter.com/projects/cartesianco/the-ex1-rapid-3d-printing-of-circuit-boards) 19 | 20 | 如果有了這樣的一台印表機,那麼我們用電腦設計的電路就可以直接被印出來,這對開發電子產品的原型將會是一大神器。 21 | 22 | ### 電路手寫筆 23 | 24 | 既然可以用印的,那當然也可以用畫的,電路手寫筆 Circuit Scribe 就是這樣一支神奇的筆,您只要畫一畫, 25 | 筆經過的地方就成了可導電的線路,這樣我們就不太需要接麵包板,只要畫一畫之後,再把元件接上去就好了。 26 | 以下是 Circuit Scribe 在 KickStarter 網站上募資時釋出的網址與影片,真是令人期待啊! 27 | 28 | * [Circuit Scribe: Draw Circuits Instantly](http://www.kickstarter.com/projects/electroninks/circuit-scribe-draw-circuits-instantly), by Electroninks Incorporated. 29 | 30 | ### 傳統的原型技術 31 | 32 | 除了以上這些比較新穎的技術之外,其實麵包板就是一種原型設計工具,而最近興起的 Arduino、Raspberry Pi 這類 33 | 開源硬體,則降低了開發電子產品原型的難度,讓我們可以在家裏設計電子產品,我想這也是為何最近 Maker 運動如火如荼 34 | 的重要原因。 35 | 36 | 但是、還有一些已經很成熟的技術,其實對製作原型也很有幫助,甚至可以讓工業技術進入家庭,或者成為玩具的, 37 | 例如像是樂高的 NXT MindStorm 機器人套件,其實某種程度上也是一種電子產品的原型設計工具。而像 Altera 與 Xylinks 38 | 這兩家廠商主宰的 FPGA 技術,則可以讓我們輕易的設計出非常複雜的數位電路,像是 CPU 等等,這些工具 39 | 對筆者而言,都是某種原型開發工具,這類工具在大學老師教電子資訊類學生的時候,會有很大的幫助, 40 | 這也是筆者為何特別關注這類技術的原因。 41 | 42 | 除此之外,近來在 Maker 運動與 KickStarter 之類的募資管道合力下,很多原本很難跨入的領域,也都有了進入家庭的可能, 43 | 像是以下的 HackRF 專案,就企圖設計出一組開放原始碼的高功能 RF 模組。 44 | 45 | * [HackRF, an open source SDR platform](http://www.kickstarter.com/projects/mossmann/hackrf-an-open-source-sdr-platform) 46 | 47 | 未來這些硬體裝置如果能與開放原始碼的軟體,像是 GNU Radio 等結合,那麼無線通訊產品的開發也可能透過這些進入家庭。 48 | 49 | 另外、筆者也特別對 Papillo 這個將 FPGA 技術開放原始碼的專案特別有興趣,一但這樣的技術能夠接上開放原始碼的 EDA 工具, 50 | 那麼就有可能突破 Altera 與 Xylinks 等廠商的壟斷型態,將 FPGA 這種強力的原型技術納入開源的版圖,於是我們就可以在這種 51 | 開源環境下設計「開源的數位電路」,再搭配像電路印表機與手寫筆等技術,或許只要一台電腦就可以開發任何數位類比電路了也說不定。 52 | 53 | * 54 | 55 | 如果您有看到哪些有趣的原型技術,也歡迎分享到 [科學玩具實驗室] 與 [程式人雜誌社團] 讓我們知道, 56 | 也歡迎加入這些社團與我們一同研究「程式、原型與玩具」等技術。 57 | 58 | 59 | -------------------------------------------------------------------------------- /source/info.md: -------------------------------------------------------------------------------- 1 | # 雜誌訊息 2 | 3 | ## 讀者訂閱 4 | 程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌,如果您願意成為本雜誌的專欄作家,請加入 [程式人雜誌社團] 一同共襄盛舉。 5 | 6 | 我們透過發行這本雜誌,希望讓大家可以讀到想讀的書,學到想學的技術,同時也讓寫作的朋友的作品能產生良好價值 – 那就是讓讀者根據雜誌的價值捐款給慈善團體。 7 | 讀雜誌做公益也不需要有壓力,您不需要每讀一本就急著去捐款,您可以讀了十本再捐,或者使用固定的月捐款方式,當成是雜誌訂閱費,或者是季捐款、一年捐一次等都 OK ! 甚至是單純當個讀者我們也都很歡迎! 8 | 9 | 本雜誌每期參考價:NT 50 元,如果您喜歡本雜誌,請將書款捐贈公益團體。例如可捐贈給「羅慧夫顱顏基金會 彰化銀行(009) 帳號:5234-01-41778-800」。(若匯款要加註可用「程式人雜誌」五個字) 10 | 11 | ## 投稿須知 12 | 13 | *給專欄寫作者:* 做公益不需要有壓力。如果您願意撰寫專欄,您可以輕鬆的寫,如果當月的稿件出不來,我們會安排其他稿件上場。 14 | 15 | *給網誌捐贈者:* 如果您沒時間寫專欄或投稿,沒關係,只要將您的網誌以 [創作共用的「姓名標示、非商業性、相同方式分享」授權] 並通知我們,我們會自動從中選取需要的文章進行編輯,放入適當的雜誌當中出刊。 16 | 17 | *給文章投稿者:* 程式人雜誌非常歡迎您加入作者的行列,如果您想撰寫任何文章或投稿,請用 markdown 或 LibreOffice 編輯好您的稿件,並於每個月 25 日前投稿到[程式人雜誌社團] 的檔案區,我們會盡可能將稿件編入隔月1號出版程式人雜誌當中,也歡迎您到社團中與我們一同討論。 18 | 19 | 如果您要投稿給程式人雜誌,我們最希望的格式是採用 markdown 的格式撰寫,然後將所有檔按壓縮為 zip 上傳到社團檔案區給我們, 如您想學習 markdown 的撰寫出版方式,可以參考 [看影片學 markdown 編輯出版流程] 一文。 20 | 21 | 如果您無法採用 markdown 的方式撰寫,也可以直接給我們您的稿件,像是 MS. Word 的 doc 檔或 LibreOffice 的 odt 檔都可以,我們 22 | 會將這些稿件改寫為 markdown 之後編入雜誌當中。 23 | 24 | ## 參與編輯 25 | 您也可以擔任程式人雜誌的編輯,甚至創造一個全新的公益雜誌,我們誠摯的邀請您加入「開放公益出版」的行列,如果您想擔任編輯或創造新雜誌,也歡迎到 [程式人雜誌社團] 來與我們討論相關事宜。 26 | 27 | ## 公益資訊 28 | 29 | ------------------------------------------------------------------------------------------------------------------------------------------------------------ 30 | 公益團體 聯絡資訊 服務對象 捐款帳號 31 | ------------------------------- ----------------------------- ----------------------------------------- ------------------------------------------- 32 | 財團法人羅慧夫顱顏基金會
顱顏患者 銀行:009彰化銀行民生分行
33 |
(如唇顎裂、小耳症或其他罕見顱顏缺陷) 帳號:5234-01-41778-800 34 | 02-27190408分機 232 35 | 36 | 社團法人台灣省兒童少年成長協會
單親、隔代教養.弱勢及一般家庭之兒童青少年 銀行:新光銀行
37 |
戶名:台灣省兒童少年成長協會
38 | 04-23058005 帳號:103-0912-10-000212-0 39 | ------------------------------- ----------------------------- ----------------------------------------- ------------------------------------------- 40 | 41 | [看影片學 markdown 編輯出版流程]:https://dl.dropboxusercontent.com/u/101584453/pmag/201304/htm/video1.html 42 | -------------------------------------------------------------------------------- /source/people1.md: -------------------------------------------------------------------------------- 1 | ## Atari 的創辦人 - Nolan Key Bushnell 2 | 3 | ![圖、Atari 的創辦人 Nolan Bushnell](../img/Nolan_Bushnell.jpg) 4 | 5 | ### 早期 6 | 7 | 1968年,Nolan Key Bushnell 從美國猶他大學畢業,當時的他應該不會想到,自己後來成為電玩史上的 8 | 傳奇人物。 9 | 10 | 1971年, Nolan Bushnell 與 Ted Babney 建造了《宇宙戰爭》的投幣式街機版本,稱為《電腦空間》。 11 | 後來 Nutting Associates 取得該遊戲授權並大量製造了 1500 部,於 1971 年 11 月發行。 12 | 雖然該遊戲因各種困難而不太成功,但卻樹立了標竿,成為第一個大量製造並供商業銷售的電子遊戲。 13 | 14 | ### Atari 公司 15 | 16 | 1972年,Nolan Bushnell 與 Ted Babney 兩人又再度攜手創辦了 Atari 公司,並且推出了革命性的 17 | 乒乓遊戲 (Pong),以下是該遊戲的一個畫面。 18 | 19 | ![圖、乒乓遊戲 Pong 的一個畫面](../img/Pong.png) 20 | 21 | 1976年,為了開發新遊戲機,Bushnell 乾脆將整個公司以2800萬美元的價格出售給 22 | 「華納通訊公司」(Warner Communications)以便取得開發資金,並在進一步取得 1 億美元的追加投資後, 23 | Atari 公司在 1977 年 開發出型號為 2600 的遊戲機,成為該公司的經典代表作,這讓 1982 年 Atari 24 | 的年銷售額達到 20 億美元。 25 | 26 | ### 離開 Atari 之後 27 | 28 | 1978 年,Nolan Bushnell 與華納通訊的老闆因公司經營方向產生爭執,於是只好離開 Atari 公司。 29 | 30 | 離開後,他手上還有一家集合「快餐、遊戲和娛樂」於一體的 Chuck E. Cheese 的 Pizza 餐館,1981 年 Nolan Bushnell 31 | 將餐館交給他人經營,並創辦了 Catalyst Technologies 這家公司 (該公司是最早期的育成中心 business incubators 之一)。 32 | 33 | 可惜的是, 1983 年時 Chuck E. Cheese 餐館出現了財務問題,並於 1984 年宣告破產。 34 | 35 | Catalyst Technologies 這家育成公司後來孵育出了 Androbot, Etak, Cumma, and Axlon 等公司,Axlon 後來創造出 36 | 不少受歡迎的產品,像是一隻泰迪熊 AG Bear,並為 Atari 2600 設計了兩款遊戲。而孵育出的 Etak 這家公司則成為 37 | 電子地圖的先驅, 38 | 39 | 1990 年代 Nolan Bushnell 成了 PlayNet 這家公司的顧問,後來又在 2000 年成立了 uWink 這家數位娛樂公司,經營 40 | 類似網咖 (網吧) 的業務。然後在 2012 年又成立了 BrainRush 這家公司,致力於開發具有教育學習功能的電玩遊戲。 41 | 42 | 2010 年 Atari 宣布 Nolan Bushnell 回到 Atari 的董事會,成為董事會的董事之一。 43 | 44 | ### Atari 與台灣 45 | 46 | Atari 公司的成功也對台灣產生了重要的影響,Atari 於 1980 年時在台灣的工廠每天可以生產1萬5000台遊戲機, 47 | 而且使用的連結器全都來自鴻海,是鴻海早期的主要客戶之一。 48 | 49 | 當初為了取得 Atari 的連結器訂單,郭台銘跳過代理通路直接找上任職於 Atari 的方國健,宣稱擁有 50 | 「秘密武器」,可以將成本大幅縮減至「嚇死人的地步」,成功的透過方國健拿下了訂單。 51 | 52 | ### 尾聲 53 | 54 | 從 Nolan Key Bushnell 的故事中,我們可以看到一位創業家奮鬥的歷程。雖然在 Atari 之後,Nolan Bushnell 55 | 看來並沒有創造出非常知名的公司,但是這樣的一位創業家與遊戲領域先驅者,即使到了老年仍然不斷的奮鬥創業, 56 | 這是非常令人敬佩的啊! 57 | 58 | ### 參考文獻 59 | * Wikipedia:[Nolan Bushnell](http://en.wikipedia.org/wiki/Nolan_Bushnell) 60 | * Wikipedia:[諾蘭·布希內爾](http://zh.wikipedia.org/wiki/%E8%AF%BA%E5%85%B0%C2%B7%E5%B8%83%E4%BB%80%E5%86%85%E5%B0%94) 61 | * Wikipedia:[Atari](http://en.wikipedia.org/wiki/Atari) 62 | * Wikipedia:[雅達利](http://zh.wikipedia.org/wiki/%E9%9B%85%E9%81%94%E5%88%A9) 63 | * Wikipedia:[UWink](http://en.wikipedia.org/wiki/UWink) 64 | * Wikipedia:[電子遊戲歷史](http://zh.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E9%81%8A%E6%88%B2%E6%AD%B7%E5%8F%B2) 65 | * [剖析鴻海1〉麥實創投董事長 方國健訪談 -- 鴻海還能代工什麼?我找不到答案](http://www.gvm.com.tw/Boardcontent_19150.html), 作者:呂愛麗, 出處:2011年12月號《遠見雜誌》 第306期。 66 | 67 | 【本文由陳鍾誠取材並修改自 [維基百科],內文採用創作共用的 [姓名標示、相同方式分享] 授權】 68 | -------------------------------------------------------------------------------- /source/article4.md: -------------------------------------------------------------------------------- 1 | ## [Visual Basic 6.0] 利用 堆疊(Stack) 實作中序轉前序與後序 (作者:廖憲得 0xde) 2 | 3 | ![](../img/prefix1.JPG) 4 | 5 | ![](../img/prefix2.JPG) 6 | 7 | ![](../img/prefix3.JPG) 8 | 9 | ![](../img/prefix4.JPG) 10 | 11 | ![](../img/prefix5.JPG) 12 | 13 | ![](../img/prefix6.JPG) 14 | 15 | ```Monobasic 16 | Dim Stack() ' 建立一個堆疊 17 | Dim StackTop ' 堆疊頂端指標 18 | 19 | Private Sub StartInFo_Click() 20 | '-----中序轉後序----- 21 | ReDim Stack(Len(Text1)) ' 堆疊大小為整串大小 (避免出錯) 22 | StackTop = 0 ' 堆疊初始化 23 | Text3 = "" ' 一開始將輸出清空 24 | 25 | For i = 1 To Len(Text1) ' 一個一個字抓直到結束 26 | Select Case Mid(Text1, i, 1) 27 | Case "(" ' 放入堆疊中 28 | StackPush (Mid(Text1, i, 1)) 29 | Case ")" 30 | ' 拿出來直到等於 "(" 31 | Do Until Stack(StackTop) = "(" 32 | Text3 = Text3 & StackPop 33 | Loop 34 | StackPop 35 | Case "+", "-" ' 如果堆疊頂端的權值大於等於讀入的值則先讀出 => "+","-","*","/" 36 | Do Until Stack(StackTop) <> "+" And Stack(StackTop) <> "-" And Stack(StackTop) <> "/" And Stack(StackTop) <> "*" 37 | Text3 = Text3 & StackPop 38 | Loop 39 | StackPush (Mid(Text1, i, 1)) 40 | Case "*", "/" ' 如果堆疊頂端的權值大於等於讀入的值則先讀出 => "*","/" 41 | Do Until Stack(StackTop) <> "*" And Stack(StackTop) <> "/" 42 | Text3 = Text3 & StackPop 43 | Loop 44 | StackPush (Mid(Text1, i, 1)) 45 | Case Else ' 除了括號或運算元直接放入 46 | Text3 = Text3 & Mid(Text1, i, 1) 47 | End Select 48 | Next i 49 | 50 | Do Until StackTop = 0 ' 將堆疊中的全部拿出來 51 | Text3 = Text3 & StackPop 52 | Loop 53 | 54 | 55 | '-----中序轉前序----- 56 | ReDim Stack(Len(Text1)) ' 堆疊大小為整串大小 (避免出錯) 57 | StackTop = 0 ' 堆疊初始化 58 | Text2 = "" ' 一開始將輸出清空 59 | 60 | For i = Len(Text1) To 1 Step -1 ' 從最後面開始做做到最前面,輸出也是從後面放到前面 61 | Select Case Mid(Text1, i, 1) 62 | Case ")" ' 放入堆疊中 63 | StackPush (Mid(Text1, i, 1)) 64 | Case "(" ' 拿出來直到等於 ")" 65 | Do Until Stack(StackTop) = ")" 66 | Text2 = StackPop & Text2 67 | Loop 68 | StackPop 69 | Case "+", "-" ' 拿到直接讀入的值 <= 堆疊頂端的值 70 | Do Until Stack(StackTop) <> "*" And Stack(StackTop) <> "/" 71 | Text2 = StackPop & Text2 72 | Loop 73 | StackPush (Mid(Text1, i, 1)) 74 | Case "*", "/" 75 | StackPush (Mid(Text1, i, 1)) ' 直接放入 76 | Case Else ' 除了括號或運算元直接放入 77 | Text2 = Mid(Text1, i, 1) & Text2 78 | End Select 79 | Next i 80 | 81 | Do Until StackTop = 0 ' 將堆疊中的全部拿出來 82 | Text2 = StackPop & Text2 83 | Loop 84 | End Sub 85 | 86 | Function StackPush(Inp) ' 放入堆疊 87 | StackTop = StackTop + 1 88 | Stack(StackTop) = Inp 89 | End Function 90 | 91 | Function StackPop() ' 從堆疊中讀出 92 | StackPop = Stack(StackTop) 93 | Stack(StackTop) = "" 94 | StackTop = StackTop - 1 95 | End Function 96 | ``` 97 | 98 | * 原始碼下載: [Visual Basic 6.0 中序轉前序與後序.rar](http://files.dotblogs.com.tw/0xde/1311/2013111884738284.rar) 99 | 100 | 【本文作者為「廖憲得」,原文網址為: ,由陳鍾誠編輯後納入本雜誌】 101 | -------------------------------------------------------------------------------- /source/article1.md: -------------------------------------------------------------------------------- 1 | ## Arduino入門教學(12) – 使用可變電阻控制伺服馬達 (作者:Cooper Maa) 2 | 3 | ### 實驗目的 4 | 5 | 練習用可變電阻控制伺服馬達(Servo motor)的旋轉角度。 6 | 7 | ![](../img/ArduinoServo1.png) 8 | 9 | ### 材料 10 | 11 | * 麵包板 x 1 12 | * Arduino 主板 x 1 13 | * 伺服馬達(Servo Motor) x 1 14 | * 10k 可變電阻 x 1 15 | * 單心線 x N 16 | 17 | ### 接線 18 | 19 | 伺服馬達有三條線,電源(紅線)、接地(黑線),以及訊號線。 20 | 21 | ![](../img/ArduinoServo2.png) 22 | 23 | 把伺服馬達紅線接到 +5v,黑線接到 GND,訊號線接到 pin 9 24 | 可變電阻中間腳位接到類比輸入(Analog Input) pin 0,剩下的兩支腳位,一支接到 5V,另外一支接到 GND 25 | 26 | ![](../img/ArduinoServoBoard1.png) 27 | 28 | ### 電路圖 29 | 30 | ![](../img/ArduinoServoCircuit1.png) 31 | 32 | ### 程式碼 33 | 34 | RC 伺服馬達(Radio Controlled Servo Motor) 大部份是透過 PWM (Pulse Width Modulation, 脈波寬度調變)來控制,Arduino 裏內建了 Servo Library 讓事情變得很簡單,就算你對 PWM 不熟,也可以很輕鬆地控制伺服馬達。底下的程式碼示範 Servo Library 的使用方法(Servo.pde): 35 | 36 | ```CPP 37 | // 引用 Servo Library 38 | #include 39 | 40 | // 建立一個 Servo 物件 41 | Servo myservo; 42 | // 旋轉角度 43 | int value = 0; 44 | 45 | void setup() 46 | { 47 | myservo.attach(9); // Servo 接在 pin 9 48 | } 49 | 50 | void loop() 51 | { 52 | if (value == 0) 53 | value = 180; 54 | else 55 | value = 0; 56 | 57 | // 叫 Servo 旋轉角度: 58 | // myservo.write(0) 是叫 Servo 旋轉到 0 度的位置 59 | // myservo.write(180) 是叫 Servo 旋轉到 180 度的位置 60 | myservo.write(value); 61 | delay(1500); 62 | } 63 | ``` 64 | 65 | 程式說明: 66 | 67 | * L2: 引用 Servo library 68 | * L5: 利用 Servo 類別建立 myservo 物件 69 | * L24: 要控制 Servo 旋轉角度,只要呼叫 Servo 的 write() 並傳入指定的角度就可以了,例如 myservo.write(180) 是控制 Servo 轉到 180 度,myservo.write(120) 是控制 Servo 轉到 120 度。 70 | 使用可變電阻控制伺服馬達(PotServo.pde): 71 | 72 | ```CPP 73 | // 使用可變電阻控制 Servo 的旋轉角度 74 | // by Michal Rinott 75 | 76 | // 引用 Servo Library 77 | #include 78 | 79 | // 建立一個 Servo 物件 80 | Servo myservo; 81 | 82 | // 可變電阻接在 Analog pin 0 83 | int potpin = 0; 84 | // 儲存旋轉角度的變數 85 | int val; 86 | 87 | void setup() 88 | { 89 | myservo.attach(9); // Servo 接在 pin 9 90 | } 91 | 92 | void loop() 93 | { 94 | val = analogRead(potpin); // 讀取可變電阻(數值介於 0 到 1023) 95 | val = map(val, 0, 1023, 0, 179); // 把 0 - 1023 的數值按比例縮放為 0 - 180 的數值 96 | myservo.write(val); // 設定 Servo 旋轉角度 97 | delay(15); // 等待 Servo 旋轉指定的位置 98 | } 99 | ``` 100 | 101 | 程式說明: 102 | 103 | * L22: 讀取可變電阻並將讀到的數值(介於 0 到 0123)儲存在 val 變數中 104 | * L23: 0 到 1023 的數值必須經過數值轉換,依比例轉為 0 到 180 的數值,因為我們的伺服馬達只能在 0 到 180 度之間旋轉。範例程式利用 map() 函式將 0 – 1023 的值對應到 0 -179。 105 | * L24: 根據讀到的可變電阻值控制 Servo 轉到指定的角度 106 | 107 | ### 範例照片/影片 108 | 109 | 請參考 makezine.com 做的這個影片,影片除了示範伺服馬達的控制外,也講解了線路的接法以及程式碼: 110 | 111 | * [YouTube: How-To Tuesday: Arduino 101 potentiometers and servos](http://youtu.be/FKj9jJgj8Pc) 112 | 113 | ### 延伸閱讀 114 | 115 | * [Servo Motor control with Arduino](http://itp.nyu.edu/physcomp/Labs/Servo) 116 | * [RC Servo 之 PWM 控制範例](http://www.embedded101.com/AnthonyLu/tabid/71/entryid/52/Default.aspx) 117 | * [GWS 廣營電子](http://www.gws.com.tw/) 118 | * [ServoMechanism](http://www.robives.com/mechs) 119 | 120 | 【本文作者為馬萬圳,原文網址為: ,由陳鍾誠編輯後納入本雜誌】 121 | 122 | -------------------------------------------------------------------------------- /htm/people2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 | 21 |

電子積木發明人 - 王文渭 老先生

22 |

還記得去年我在萬華萬大路的一家隱身於巷子內的超難找小店裏,買了一盒「電子積木」玩具, 那盒積木大概就像下列淘寶網電子積木分類下的這些玩具一樣

23 | 26 |

但是、由於今年淘寶透過全家便利店直接攻入台灣,現在您應該可以輕鬆的透過「全家取貨」的方式買到這類的東西了。

27 | 30 |

雖然這樣的電子積木,在技術層次上並不是非常高,但是卻是真正能量產,能夠賣到商場與玩具店的一種教學產品。

31 |

令人意外的,在中國大陸,這類型的電子積木,卻是由一位王文渭老先生所發明的,以下是節錄自 互動百科:王文渭 的一段描述:

32 |
33 |

1988年,王文渭還是湖北省電業技工學校電子老師,在實際的電子教學過程中,為了讓學生更形像更直觀的了解電子電路,王老師根據多年的實際教學經驗,發明了多用電子電工實驗裝置,專門用於電子電路實驗教學。此方法在老師和學生中大受歡迎。後來此裝置還獲得了國家教育部實驗教學的特等獎。

34 |

1995年,王老師進一步改善了萬用電子積木,並重新申請了專利。於是,一款用於兒童早教、開發智力的兒童玩具終於誕生了。這項發明,在電子玩具領域內,不僅在國內尚屬首例,在國際市場上也是空白!

35 |

1996年,王老師在朋友的介紹來,來到了杭州,此時杭州有兩家企業願意與他合作,王老師終於選擇了其中一家公司,簽訂協議後,成立了杭州科林電子有限公司,主打產品《百變電子圖》。科林公司為了盡快讓這一產品推廣到市場,通過教育部門,在全國範圍內舉辦了中小學生電子競賽。通過這場競賽,百變電子圖終於走進了千家萬戶。在與科林的三年合同期間,百變電子圖為公司帶來了近千萬元的營業額,萬老師也從中獲取了相應的報酬!而王老師的“電子要從娃娃抓起的目標”終於實現了!

36 |
37 |

以下是互動百科中有關這種電子積木的介紹:

38 | 41 |

另外、大陸也有一些電視節目訪問並介紹了「王文渭」老先生,以下是其中的幾段訪問。

42 | 45 |

關於這些電子積木的玩法,您可以參考下列的影片:

46 | 51 |

這樣的玩具讓我想起在我小時候的台灣,有一款玩具叫做「動動腦」,您可以在以下網址看到這種玩具。

52 | 55 |

我很喜歡像「動動腦」這類的玩具,而且「動動腦」赤裸裸的將「電容、電阻、電感」呈現在小孩的眼前,玩的時後感覺更加有意思, 只是入門的難度會更高一些,而且對兒童恐怕會有一些安全性的問題。

56 |

我在想,如果能將 Arduino、Raspberry Pi、與麵包板之類的電子實驗器材,改造成安全性較高的玩具,那應該對小孩會是一個很有 吸引力的東西,樂高的 NXT MindStorm 就是一個成功的範例,不過如果能夠進一步納入 FPGA 之類的設備,讓小孩也能自行學習 設計 CPU、甚至是無線收發模組,那我想對激發小孩的學習潛力而言,應該會有很好的效果才對。

57 |
58 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /htm/video1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 | 21 |

看影片瞭解電玩遊戲的起源與歷史

22 |

對於台灣的五年級 (民國 50 年代出生) 的朋友們而言,可能很多人都玩過那種小型的掌上遊戲機, 但是大部分的人可能不瞭解這類電動遊戲的歷史,以下的影片用較通俗的方式介紹了電玩的歷史。

23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
History of Video Games內容簡介連結
前言Making ofhttp://youtu.be/YqJEgA93KEo
第 1 集steve russell, computer space, spacewarhttp://youtu.be/Egw-EdMVZ4w
第 2 集Magnavox Odyssey Ralph Baerhttp://youtu.be/BNkDjQPdlu0
第 2B 集Magnavox Odyssey Light Rifle Gunhttp://youtu.be/WyXwqJOyDUY
第 3 集PONG, Space Race, Gotcha, Gran Trak 10http://youtu.be/Or35jROrkmc
第 4 集steve russell, computer space, spacewarhttp://youtu.be/XgzJWYNtVJY
64 |
65 | 圖、第一個進入生活領域的 Pong 電玩遊戲

圖、第一個進入生活領域的 Pong 電玩遊戲

66 |
67 |

看到上面的「乒乓球」遊戲,真的讓我想起很小的時候,曾經看過且玩過這樣的遊戲機,而後來的「小蜜蜂」 、「小精靈」等遊戲,還曾經造成很多小學生在電動玩具店流連忘返。

68 |

我記得在我小學一年級左右,台灣街頭巷尾都有人在店裏擺上一台電動機台,小孩投兩塊錢好像就可以玩一次, 那時候我很喜歡玩「小精靈、小蜜蜂」之類的遊戲,可惜功力太差,常常不到兩分鐘就掛了。

69 |

但是我的大哥後來練到功力很好,結果怎麼打都不會掛,還常常引起一堆人在旁圍觀,一打就是一個小時, 結果 .... ,我的老爸聞風而來,把他給捉回去,然後就禁止他打電動了。

70 |

而我、則是因為功力太差,反而逃過一劫 ...

71 |

參考文獻

72 | 76 |

【本文由陳鍾誠取材並修改自 維基百科,採用創作共用的 姓名標示、相同方式分享 授權】

77 |
78 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /htm/message2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 | 21 |

硬體短訊:把工廠搬入家庭的「原型製作」技術

22 |

最近兩年在 3D 印表機的帶頭之下,興起了一個 Maker 熱潮,雖然 3D 印表已經存在了幾十年了, 但是這類的技術最近激起了很多人的希望,或許有機會可以將不少原本只有在工廠可以做出來的東西 搬回家裏做也說不定。

23 |

以下我們將介紹一些類似 3D 印表機的原型技術,這些技術很多都還在發展當中,尚未真正的商品化, 但有些卻是已經很成熟的老掉牙技術了,不過一但這些技術成功的進入家庭,都會對 Maker 運動產生 正面的影響。

24 |

電路印表機

25 |

電路印表機是一種可以印出電路的機器,據說這種印表機的成本相當的便宜,大約台幣一萬元左右而已, 而且一分鐘之內就可以印出一張電路。

26 | 31 |

如果有了這樣的一台印表機,那麼我們用電腦設計的電路就可以直接被印出來,這對開發電子產品的原型將會是一大神器。

32 |

電路手寫筆

33 |

既然可以用印的,那當然也可以用畫的,電路手寫筆 Circuit Scribe 就是這樣一支神奇的筆,您只要畫一畫, 筆經過的地方就成了可導電的線路,這樣我們就不太需要接麵包板,只要畫一畫之後,再把元件接上去就好了。 以下是 Circuit Scribe 在 KickStarter 網站上募資時釋出的網址與影片,真是令人期待啊!

34 | 37 |

傳統的原型技術

38 |

除了以上這些比較新穎的技術之外,其實麵包板就是一種原型設計工具,而最近興起的 Arduino、Raspberry Pi 這類 開源硬體,則降低了開發電子產品原型的難度,讓我們可以在家裏設計電子產品,我想這也是為何最近 Maker 運動如火如荼 的重要原因。

39 |

但是、還有一些已經很成熟的技術,其實對製作原型也很有幫助,甚至可以讓工業技術進入家庭,或者成為玩具的, 例如像是樂高的 NXT MindStorm 機器人套件,其實某種程度上也是一種電子產品的原型設計工具。而像 Altera 與 Xylinks 這兩家廠商主宰的 FPGA 技術,則可以讓我們輕易的設計出非常複雜的數位電路,像是 CPU 等等,這些工具 對筆者而言,都是某種原型開發工具,這類工具在大學老師教電子資訊類學生的時候,會有很大的幫助, 這也是筆者為何特別關注這類技術的原因。

40 |

除此之外,近來在 Maker 運動與 KickStarter 之類的募資管道合力下,很多原本很難跨入的領域,也都有了進入家庭的可能, 像是以下的 HackRF 專案,就企圖設計出一組開放原始碼的高功能 RF 模組。

41 | 44 |

未來這些硬體裝置如果能與開放原始碼的軟體,像是 GNU Radio 等結合,那麼無線通訊產品的開發也可能透過這些進入家庭。

45 |

另外、筆者也特別對 Papillo 這個將 FPGA 技術開放原始碼的專案特別有興趣,一但這樣的技術能夠接上開放原始碼的 EDA 工具, 那麼就有可能突破 Altera 與 Xylinks 等廠商的壟斷型態,將 FPGA 這種強力的原型技術納入開源的版圖,於是我們就可以在這種 開源環境下設計「開源的數位電路」,再搭配像電路印表機與手寫筆等技術,或許只要一台電腦就可以開發任何數位類比電路了也說不定。

46 | 49 |

如果您有看到哪些有趣的原型技術,也歡迎分享到 科學玩具實驗室程式人雜誌社團 讓我們知道, 也歡迎加入這些社團與我們一同研究「程式、原型與玩具」等技術。

50 |
51 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /htm/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |

關於程式人雜誌

17 |

程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌。

18 |

雜誌下載

19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
出刊年月epubipad:PDFA4:PDF單頁 HTM原始碼
2013年12月epubipad.pdfA4.pdfpmag.htmlcode.zip
41 |

本期內容

42 | 73 |

雜誌取得

74 |

程式人雜誌預定於每個月 1 日出刊,您可以從下列網址取得程式人雜誌的所有內容 (包含當月最新出刊的雜誌)。

75 | 78 |

連絡我們

79 |

竭誠歡迎程式人投稿,或者成為本雜誌的專欄作家,現在就可以加入 程式人雜誌社團 一同共襄盛舉。

80 |

本雜誌編輯為「陳鍾誠 (@ccckmit)」,若要聯絡編輯,請寄信到

86 |
87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /source/message1.md: -------------------------------------------------------------------------------- 1 | ## 歷史短訊:電玩遊戲的歷史 2 | 3 | 對於台灣的五年級 (民國 50 年代出生) 的朋友們而言,可能很多人都玩過那種小型的掌上遊戲機, 4 | 但是大部分的人可能不瞭解這類電動遊戲的歷史,在本期的程式人雜誌當中,我們會將焦點放在遊戲 5 | 與其相關產品的歷史介紹上。 6 | 7 | ### 1950 年代 8 | 9 | 電玩遊戲起源於 1950 年代,Thomas T. Goldsmith Jr. 與 Estle Ray Mann兩人是第一位申請遊戲機專利者, 10 | 描述了一個用了八顆真空管以模擬飛彈對目標發射,包括使用許多旋紐以調整飛彈航線與速度的遊戲裝置, 11 | 但是當時的顯示技術還不夠成熟,結果只好改用單層透明版畫當目標,所以這個遊戲機不太好用。 12 | 13 | 1951年,英國的 Christopher Strachey 寫出了西洋跳棋程式,1952年劍橋大學的 A.S. Douglas 發展出了 14 | 一個稱為《OXO》井字棋遊戲。1958年 William Higinbotham 利用示波器與類比電腦創造出了《雙人網球》遊戲。 15 | 16 | ### 1960 年代 17 | 18 | 1961年,美國的 Steve Russell 等學生,於麻省理工學院的一部 DEC PDP-1 電腦中寫了一個名為《宇宙戰爭》 19 | (Spacewar!)的遊戲。後來這款遊戲還在早期的網際網路上發售。因此 Spacewar 被認為是第一個廣為 20 | 流傳及具影響力的電子遊戲。 21 | 22 | 1966年,Ralph Baer 發明了一個在標準電視上顯示的簡單電子遊戲:《追擊》(Chase)。 23 | 後來並幫助 Bill Harrison 一起製造了光線槍並於1967年與 Bill Rusch 共同開發了幾個電子遊戲。1968年他們發展出一個具有桌球及射擊等不同遊戲的原型機。 24 | 25 | 1969年,C 語言發明人之一的 Ken Thompson 寫了一個在 Multics 系統上運行的《太空旅行》 26 | (Space Travel)遊戲。後來 Ken Thompson 改用 PDP-7 撰寫,結果寫著寫著就創造出了 UNIX 作業系統, 27 | 而《太空旅行》也就成了 UNIX 的第一個應用程式。 28 | 29 | ### 1970 年代 30 | 31 | 1971年9月,模仿《宇宙戰爭》的初代小蜜蜂遊戲(Galaxy Game)被安裝在史丹福大學的一個學生活動中心裏。 32 | 是第一個投幣式電子遊戲,而且該機器只有建造一部。 33 | 34 | 1971年, Nolan Bushnell 與 Ted Babney 建造了《宇宙戰爭》的投幣式街機版本,稱為《電腦空間》。 35 | 後來 Nutting Associates 取得該遊戲授權並大量製造了 1500 部,於 1971 年 11 月發行。 36 | 雖然該遊戲因各種困難而不太成功,但卻樹立了標竿,成為第一個大量製造並供商業銷售的電子遊戲。 37 | 38 | 有了上述的經驗, Nolan Bushnell 與 Ted Babney 兩人乾脆攜手於 1972 年創立了 Atari 公司, 39 | 並於同一年內就創造出 《乓》(Pong)這款遊戲,而且大獲成功,總共賣了19,000 部,以下是 Pong 這個遊戲 40 | 的畫面,或許您曾經玩過也說不定。 41 | 42 | ![圖、Pong 遊戲的畫面](../img/Pong.png) 43 | 44 | 1977年,Atari發行了名為 Video Computer System (VCS) 卡匣為主的遊戲機,後來改稱Atari 2600, 45 | 設計了9款遊戲並在假期季節發行。它迅速成為所有早期遊戲機當中最受歡迎的一款。 46 | 47 | 後來日本開始踏進遊戲工業,1978年日本 TAITO 公司開發出的《太空侵略者》(Space Invaders)大賣, 48 | 遊戲產業開始進入美日兩國相互競爭的年代。 49 | 50 | 1979 年的小精靈《Pac-Man》第一個在主流文化上廣受歡迎,並且是第一個遊戲角色以其自己本身形象 51 | 獲得大眾肯定的遊戲。 52 | 53 | 54 | ### 1980 年代 55 | 56 | 街機黃金年代在1980年代到達了頂峰,很多在技術或類型上革新的遊戲在80年代前幾年紛紛出現。 57 | 58 | 《3D怪物迷宮》(3D Monster Maze,1981年)是家用電腦上的第一個三維遊戲,而《戴格拉斯地下城》(Dungeons of Daggorath,1982年)則再添加了各種類型的武器與怪物、細緻的音效、和一個「心跳」的血條。《一級方程式賽車》(Pole Position,1982年)。 59 | 60 | 1980年發行的《魔域》更進一步地使文字冒險遊戲在家用電腦上流行起來,並確立了開發商Infocom在這類型遊戲上的優勢。 61 | 62 | 1982年8月,Commodore 64公開發行。它因為強勢行銷與優越價位造成其一開始就賣得火紅。 63 | 64 | 1983年 SuperSet Software公司創造了《狙擊》(Snipes)這個文字模式的網路電腦遊戲,並在新的IBM PC架構下的電腦網路測試、展示遊戲功能。 65 | 66 | 1984年一個真正的現代冒險遊戲隨著雪樂山《國王密使》系列誕生。 67 | 68 | BBS 在1980年代十分流行,因此有時被用來當作線上遊戲進行的平台。許多玩家透過 BBS 進行遊戲。遊戲類型從文字冒險到賭博遊戲如廿一點等。也有多人遊戲像是 MUD (Multi-User Dungeons) 等等,這些遊戲最終進化成今日眾所週知的 MMORPG(大型多人在線角色扮演遊戲)。 69 | 70 | 任天堂的 Game &Watch 生產線在 1980 年開始生產 LCD 可攜遊戲機。 後來很多廠商也開始做。它們的體積很小,有些可以像手錶一樣可載在手腕上。 71 | 72 | 電腦遊戲市場於 1984 年取代了家用機市場。1985年,北美的電子遊戲市場因任天堂在亞洲外被稱為任天堂娛樂系統(Nintendo Entertainment System,縮寫為NES)的8位元FC遊戲機(任天堂紅白機)的發行而復甦。該機隨機銷售《超級瑪利歐》,立即大賣。在新遊戲機裏,手柄取代了搖桿、旋鈕及keypad成為系統所包括的預設遊戲操縱器。一個備8個方向的指向柄(Directional-pad, D-pad)和2個或以上的行動鍵的手柄設計成為了當時的標準。 73 | 74 | 1986年《勇者鬥惡龍系列》第一部《勇者鬥惡龍 I》發行,在日本文化上造成有史以來的奇蹟,又稱國民RPG。 75 | 76 | ### 1990 年代 77 | 78 | 1990年代三維電腦圖像,伴隨著透過音效卡與光碟機的「多媒體」能力升級。1992年即時戰略遊戲(RTS)沙丘魔堡II發行。它當然絕不是該類型遊戲第一炮(許多其他遊戲足以被稱為非常原始的RTS,請參見即時戰略遊戲歷史),不過它為後來的票房RTS遊戲如魔獸爭霸、終極動員令、與星海爭霸定下了這類遊戲的標準技巧。 79 | 80 | 1990年代Maxis開始發行它成功的《模擬XX系列》,從《模擬城市》(Sim City)開始,以其它不同的變種作為延續,如《模擬地球》(Sim Earth)、《模擬城市2000》(Sim City 2000)、《模擬螞蟻》(Sim Antz)、《模擬大樓》(Sim Towers)及2000年推出、後來燴炙人口的日常生活模擬器──《模擬人生》(The Sims)。 81 | 82 | 1996年,隨著3dfx的Voodoo晶片上市,引領了第一個個人電腦上使用的平價3D加速卡。第一人稱射擊遊戲(如有名的《雷神之錘》)是其中第一個利用這新技術的。 83 | 84 | 任天堂64沿用了卡匣而非CD-ROM,此舉帶來了較高的成本並引起遊戲廠商的不滿。值得一提的是,史克威爾把之前由任天堂家機平台獨佔的《最終幻想》系列轉給了PlayStation;1997年《最終幻想VII》的巨大成功,使 PlayStation成為該類遊戲的主要平台,並帶動RPG的流行。 85 | 86 | 1998 年投入市場的Dreamcast,開啟了此世代的大門,但其銷路不佳,隨後在後繼機種出現前就淡出市場,SEGA 因此撤退到第三方遊戲開發市場。索尼以PlayStation 2 開啟新的紀元,該機器日後成為目前為止銷售最佳的家用機。 87 | 88 | ### 2000 年之後 89 | 90 | 在2001年年終之前,視窗作業系統暨專業生產力軟體巨擘微軟,挾家用機市場成熟與世嘉和任天堂的衰頹,以Xbox切入電子遊戲業。 91 | 92 | 隨著價廉物美的寬頻網際網路連線在全球普及,許多出版商轉向時間計費線上遊戲,作為一種創新嘗試。大型多人在線角色扮演遊戲(MMORPG)號召了許多作品的賣座,如《魔獸世界》(World of Warcraft)與《最終幻想XI》(Final Fantasy XI)。此類遊戲主打PC市場,Xbox透過其內建的網路介面分了一杯羹。而PS2與GameCube缺乏上線能力,兩者後來都有這類連網附加週邊發行,但反響效果不如xbox live。 93 | 94 | 2005年任天堂的 Wii Remote 成功的將手握型遙控體感裝置帶入家庭遊戲的領域,成為新一代家庭遊戲機的典範。 95 | 96 | 2010年,微軟推出了 Kinect 改用身體當作體感裝置,搶食了 Wii 的市場。 97 | 98 | 接著、蘋果推出的 iPad 大受歡迎,讓平板遊戲開始快速發展,整個世界進入了行動娛樂的新時代 ..... 99 | 100 | ### 參考文獻 101 | * [電子遊戲歷史](http://zh.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E9%81%8A%E6%88%B2%E6%AD%B7%E5%8F%B2) 102 | * [History of video games](http://en.wikipedia.org/wiki/History_of_video_games) 103 | 104 | 【本文由陳鍾誠取材並修改自 [維基百科],採用創作共用的 [姓名標示、相同方式分享] 授權】 105 | 106 | -------------------------------------------------------------------------------- /htm/people1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 | 21 |

Atari 的創辦人 - Nolan Key Bushnell

22 |
23 | 圖、Atari 的創辦人 Nolan Bushnell

圖、Atari 的創辦人 Nolan Bushnell

24 |
25 |

早期

26 |

1968年,Nolan Key Bushnell 從美國猶他大學畢業,當時的他應該不會想到,自己後來成為電玩史上的 傳奇人物。

27 |

1971年, Nolan Bushnell 與 Ted Babney 建造了《宇宙戰爭》的投幣式街機版本,稱為《電腦空間》。 後來 Nutting Associates 取得該遊戲授權並大量製造了 1500 部,於 1971 年 11 月發行。 雖然該遊戲因各種困難而不太成功,但卻樹立了標竿,成為第一個大量製造並供商業銷售的電子遊戲。

28 |

Atari 公司

29 |

1972年,Nolan Bushnell 與 Ted Babney 兩人又再度攜手創辦了 Atari 公司,並且推出了革命性的 乒乓遊戲 (Pong),以下是該遊戲的一個畫面。

30 |
31 | 圖、乒乓遊戲 Pong 的一個畫面

圖、乒乓遊戲 Pong 的一個畫面

32 |
33 |

1976年,為了開發新遊戲機,Bushnell 乾脆將整個公司以2800萬美元的價格出售給 「華納通訊公司」(Warner Communications)以便取得開發資金,並在進一步取得 1 億美元的追加投資後, Atari 公司在 1977 年 開發出型號為 2600 的遊戲機,成為該公司的經典代表作,這讓 1982 年 Atari 的年銷售額達到 20 億美元。

34 |

離開 Atari 之後

35 |

1978 年,Nolan Bushnell 與華納通訊的老闆因公司經營方向產生爭執,於是只好離開 Atari 公司。

36 |

離開後,他手上還有一家集合「快餐、遊戲和娛樂」於一體的 Chuck E. Cheese 的 Pizza 餐館,1981 年 Nolan Bushnell 將餐館交給他人經營,並創辦了 Catalyst Technologies 這家公司 (該公司是最早期的育成中心 business incubators 之一)。

37 |

可惜的是, 1983 年時 Chuck E. Cheese 餐館出現了財務問題,並於 1984 年宣告破產。

38 |

Catalyst Technologies 這家育成公司後來孵育出了 Androbot, Etak, Cumma, and Axlon 等公司,Axlon 後來創造出 不少受歡迎的產品,像是一隻泰迪熊 AG Bear,並為 Atari 2600 設計了兩款遊戲。而孵育出的 Etak 這家公司則成為 電子地圖的先驅,

39 |

1990 年代 Nolan Bushnell 成了 PlayNet 這家公司的顧問,後來又在 2000 年成立了 uWink 這家數位娛樂公司,經營 類似網咖 (網吧) 的業務。然後在 2012 年又成立了 BrainRush 這家公司,致力於開發具有教育學習功能的電玩遊戲。

40 |

2010 年 Atari 宣布 Nolan Bushnell 回到 Atari 的董事會,成為董事會的董事之一。

41 |

Atari 與台灣

42 |

Atari 公司的成功也對台灣產生了重要的影響,Atari 於 1980 年時在台灣的工廠每天可以生產1萬5000台遊戲機, 而且使用的連結器全都來自鴻海,是鴻海早期的主要客戶之一。

43 |

當初為了取得 Atari 的連結器訂單,郭台銘跳過代理通路直接找上任職於 Atari 的方國健,宣稱擁有 「秘密武器」,可以將成本大幅縮減至「嚇死人的地步」,成功的透過方國健拿下了訂單。

44 |

尾聲

45 |

從 Nolan Key Bushnell 的故事中,我們可以看到一位創業家奮鬥的歷程。雖然在 Atari 之後,Nolan Bushnell 看來並沒有創造出非常知名的公司,但是這樣的一位創業家與遊戲領域先驅者,即使到了老年仍然不斷的奮鬥創業, 這是非常令人敬佩的啊!

46 |

參考文獻

47 | 56 |

【本文由陳鍾誠取材並修改自 維基百科,內文採用創作共用的 姓名標示、相同方式分享 授權】

57 |
58 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /htm/info.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 25 |
26 |

雜誌訊息

27 |

讀者訂閱

28 |

程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌,如果您願意成為本雜誌的專欄作家,請加入 程式人雜誌社團 一同共襄盛舉。

29 |

我們透過發行這本雜誌,希望讓大家可以讀到想讀的書,學到想學的技術,同時也讓寫作的朋友的作品能產生良好價值 – 那就是讓讀者根據雜誌的價值捐款給慈善團體。 讀雜誌做公益也不需要有壓力,您不需要每讀一本就急著去捐款,您可以讀了十本再捐,或者使用固定的月捐款方式,當成是雜誌訂閱費,或者是季捐款、一年捐一次等都 OK ! 甚至是單純當個讀者我們也都很歡迎!

30 |

本雜誌每期參考價:NT 50 元,如果您喜歡本雜誌,請將書款捐贈公益團體。例如可捐贈給「羅慧夫顱顏基金會 彰化銀行(009) 帳號:5234-01-41778-800」。(若匯款要加註可用「程式人雜誌」五個字)

31 |

投稿須知

32 |

給專欄寫作者: 做公益不需要有壓力。如果您願意撰寫專欄,您可以輕鬆的寫,如果當月的稿件出不來,我們會安排其他稿件上場。

33 |

給網誌捐贈者: 如果您沒時間寫專欄或投稿,沒關係,只要將您的網誌以 [創作共用的「姓名標示、非商業性、相同方式分享」授權] 並通知我們,我們會自動從中選取需要的文章進行編輯,放入適當的雜誌當中出刊。

34 |

給文章投稿者: 程式人雜誌非常歡迎您加入作者的行列,如果您想撰寫任何文章或投稿,請用 markdown 或 LibreOffice 編輯好您的稿件,並於每個月 25 日前投稿到程式人雜誌社團 的檔案區,我們會盡可能將稿件編入隔月1號出版程式人雜誌當中,也歡迎您到社團中與我們一同討論。

35 |

如果您要投稿給程式人雜誌,我們最希望的格式是採用 markdown 的格式撰寫,然後將所有檔按壓縮為 zip 上傳到社團檔案區給我們, 如您想學習 markdown 的撰寫出版方式,可以參考 看影片學 markdown 編輯出版流程 一文。

36 |

如果您無法採用 markdown 的方式撰寫,也可以直接給我們您的稿件,像是 MS. Word 的 doc 檔或 LibreOffice 的 odt 檔都可以,我們 會將這些稿件改寫為 markdown 之後編入雜誌當中。

37 |

參與編輯

38 |

您也可以擔任程式人雜誌的編輯,甚至創造一個全新的公益雜誌,我們誠摯的邀請您加入「開放公益出版」的行列,如果您想擔任編輯或創造新雜誌,也歡迎到 程式人雜誌社團 來與我們討論相關事宜。

39 |

公益資訊

40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 74 | 75 | 76 | 77 |
公益團體聯絡資訊服務對象捐款帳號
財團法人羅慧夫顱顏基金會http://www.nncf.org/

02-27190408分機 232
顱顏患者 (如唇顎裂、小耳症或其他罕見顱顏缺陷)銀行:009彰化銀行民生分行
帳號:5234-01-41778-800
社團法人台灣省兒童少年成長協會http://www.cyga.org/

04-23058005
單親、隔代教養.弱勢及一般家庭之兒童青少年銀行:新光銀行
戶名:台灣省兒童少年成長協會
帳號:103-0912-10-000212-0
78 |
79 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/avg_exp.dat: -------------------------------------------------------------------------------- 1 | 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 2 | 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 3 | 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 4 | 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 5 | 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 6 | 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 7 | 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 8 | 10.0000000 2.0000000 4.0000000 6.0000000 8.0000000 9 | 10.0000000 3.6000000 6.4000000 8.4000000 9.6000000 10 | 10.0000000 4.8800000 7.8400000 9.3600000 9.9200000 11 | 10.0000000 5.9040000 8.7040000 9.7440000 9.9840000 12 | 10.0000000 6.7232000 9.2224000 9.8976000 9.9968000 13 | 10.0000000 7.3785600 9.5334400 9.9590400 9.9993600 14 | 10.0000000 7.9028480 9.7200640 9.9836160 9.9998720 15 | 10.0000000 8.3222784 9.8320384 9.9934464 9.9999744 16 | 10.0000000 8.6578227 9.8992230 9.9973786 9.9999949 17 | 10.0000000 8.9262582 9.9395338 9.9989514 9.9999990 18 | 10.0000000 9.1410065 9.9637203 9.9995806 9.9999998 19 | 10.0000000 9.3128052 9.9782322 9.9998322 10.0000000 20 | 10.0000000 9.4502442 9.9869393 9.9999329 10.0000000 21 | 10.0000000 9.5601953 9.9921636 9.9999732 10.0000000 22 | 10.0000000 9.6481563 9.9952982 9.9999893 10.0000000 23 | 10.0000000 9.7185250 9.9971789 9.9999957 10.0000000 24 | 10.0000000 9.7748200 9.9983073 9.9999983 10.0000000 25 | 10.0000000 9.8198560 9.9989844 9.9999993 10.0000000 26 | 10.0000000 9.8558848 9.9993906 9.9999997 10.0000000 27 | 10.0000000 9.8847078 9.9996344 9.9999999 10.0000000 28 | 10.0000000 9.9077663 9.9997806 10.0000000 10.0000000 29 | 10.0000000 9.9262130 9.9998684 10.0000000 10.0000000 30 | 10.0000000 9.9409704 9.9999210 10.0000000 10.0000000 31 | 10.0000000 9.9527763 9.9999526 10.0000000 10.0000000 32 | 10.0000000 9.9622211 9.9999716 10.0000000 10.0000000 33 | 10.0000000 9.9697769 9.9999829 10.0000000 10.0000000 34 | 10.0000000 9.9758215 9.9999898 10.0000000 10.0000000 35 | 10.0000000 9.9806572 9.9999939 10.0000000 10.0000000 36 | 10.0000000 9.9845257 9.9999963 10.0000000 10.0000000 37 | 10.0000000 9.9876206 9.9999978 10.0000000 10.0000000 38 | 10.0000000 9.9900965 9.9999987 10.0000000 10.0000000 39 | 10.0000000 9.9920772 9.9999992 10.0000000 10.0000000 40 | 10.0000000 9.9936617 9.9999995 10.0000000 10.0000000 41 | 10.0000000 9.9949294 9.9999997 10.0000000 10.0000000 42 | 10.0000000 9.9959435 9.9999998 10.0000000 10.0000000 43 | 10.0000000 9.9967548 9.9999999 10.0000000 10.0000000 44 | 10.0000000 9.9974039 9.9999999 10.0000000 10.0000000 45 | 10.0000000 9.9979231 10.0000000 10.0000000 10.0000000 46 | 10.0000000 9.9983385 10.0000000 10.0000000 10.0000000 47 | 10.0000000 9.9986708 10.0000000 10.0000000 10.0000000 48 | 10.0000000 9.9989366 10.0000000 10.0000000 10.0000000 49 | 10.0000000 9.9991493 10.0000000 10.0000000 10.0000000 50 | 10.0000000 9.9993194 10.0000000 10.0000000 10.0000000 51 | 10.0000000 9.9994555 10.0000000 10.0000000 10.0000000 52 | 10.0000000 9.9995644 10.0000000 10.0000000 10.0000000 53 | 10.0000000 9.9996516 10.0000000 10.0000000 10.0000000 54 | 10.0000000 9.9997212 10.0000000 10.0000000 10.0000000 55 | 10.0000000 9.9997770 10.0000000 10.0000000 10.0000000 56 | 10.0000000 9.9998216 10.0000000 10.0000000 10.0000000 57 | 10.0000000 9.9998573 10.0000000 10.0000000 10.0000000 58 | 10.0000000 9.9998858 10.0000000 10.0000000 10.0000000 59 | 10.0000000 9.9999087 10.0000000 10.0000000 10.0000000 60 | 10.0000000 9.9999269 10.0000000 10.0000000 10.0000000 61 | 10.0000000 9.9999415 10.0000000 10.0000000 10.0000000 62 | 10.0000000 9.9999532 10.0000000 10.0000000 10.0000000 63 | 10.0000000 9.9999626 10.0000000 10.0000000 10.0000000 64 | 10.0000000 9.9999701 10.0000000 10.0000000 10.0000000 65 | 10.0000000 9.9999761 10.0000000 10.0000000 10.0000000 66 | 10.0000000 9.9999808 10.0000000 10.0000000 10.0000000 67 | 10.0000000 9.9999847 10.0000000 10.0000000 10.0000000 68 | 10.0000000 9.9999877 10.0000000 10.0000000 10.0000000 69 | 10.0000000 9.9999902 10.0000000 10.0000000 10.0000000 70 | 10.0000000 9.9999922 10.0000000 10.0000000 10.0000000 71 | 10.0000000 9.9999937 10.0000000 10.0000000 10.0000000 72 | 10.0000000 9.9999950 10.0000000 10.0000000 10.0000000 73 | 10.0000000 9.9999960 10.0000000 10.0000000 10.0000000 74 | 10.0000000 9.9999968 10.0000000 10.0000000 10.0000000 75 | 10.0000000 9.9999974 10.0000000 10.0000000 10.0000000 76 | 10.0000000 9.9999979 10.0000000 10.0000000 10.0000000 77 | 10.0000000 9.9999984 10.0000000 10.0000000 10.0000000 78 | 10.0000000 9.9999987 10.0000000 10.0000000 10.0000000 79 | 10.0000000 9.9999989 10.0000000 10.0000000 10.0000000 80 | 10.0000000 9.9999992 10.0000000 10.0000000 10.0000000 81 | 10.0000000 9.9999993 10.0000000 10.0000000 10.0000000 82 | 10.0000000 9.9999995 10.0000000 10.0000000 10.0000000 83 | 10.0000000 9.9999996 10.0000000 10.0000000 10.0000000 84 | 10.0000000 9.9999997 10.0000000 10.0000000 10.0000000 85 | 10.0000000 9.9999997 10.0000000 10.0000000 10.0000000 86 | 10.0000000 9.9999998 10.0000000 10.0000000 10.0000000 87 | 10.0000000 9.9999998 10.0000000 10.0000000 10.0000000 88 | 10.0000000 9.9999999 10.0000000 10.0000000 10.0000000 89 | 10.0000000 9.9999999 10.0000000 10.0000000 10.0000000 90 | 10.0000000 9.9999999 10.0000000 10.0000000 10.0000000 91 | 10.0000000 9.9999999 10.0000000 10.0000000 10.0000000 92 | 10.0000000 9.9999999 10.0000000 10.0000000 10.0000000 93 | 10.0000000 10.0000000 10.0000000 10.0000000 10.0000000 94 | 10.0000000 10.0000000 10.0000000 10.0000000 10.0000000 95 | 10.0000000 10.0000000 10.0000000 10.0000000 10.0000000 96 | 10.0000000 10.0000000 10.0000000 10.0000000 10.0000000 97 | 10.0000000 10.0000000 10.0000000 10.0000000 10.0000000 98 | 10.0000000 10.0000000 10.0000000 10.0000000 10.0000000 99 | 10.0000000 10.0000000 10.0000000 10.0000000 10.0000000 100 | 10.0000000 10.0000000 10.0000000 10.0000000 10.0000000 101 | -------------------------------------------------------------------------------- /source/article6.md0: -------------------------------------------------------------------------------- 1 | ## R 講題分享 - 種類數的估計與預測 2 | 3 | ### 簡介 4 | 5 | 關於一個集合內部種類數的估計問題,在各種領域中廣泛的討論。譬如:戶政機關的人口數估計、流行病學中的罹病人數估計、生態學中的物種數估計、程式設計中的臭蟲數估計、考古學中的器皿數估計、古典文學中的作家字彙數估計等等。任職於清華統計所的 [趙蓮菊](http://chao.stat.nthu.edu.tw/) 教授是國際間研究種類數估計的大師,本文將簡單的介紹趙教授關於種類數估計問題所發展的統計方法。 6 | 7 | ### 研究問題與資料格式 8 | 9 | 為了得知集合中的種類數,勢必透過抽樣資料來估計。本文舉李蕙帆 (2008) 對於曹雪芹先生所撰寫的經典名著紅樓夢做為例子,假定欲探討的集合為文學大家曹雪芹先生所認識的字彙,則紅樓夢前80回 (一般認為120回的紅樓夢,前80回為曹雪芹所作,後40回為他人續作) 可視為曹先生認識字彙的抽樣結果,下表為種類數調查數據的基本格式,即曹雪芹在紅樓夢前80回的用字頻率,fi 表示小說中出現i次的字彙數目: 10 | 11 | i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 10up 12 | ------|-----|-----|-----|-----|-----|-----|-----|-----|-----| --- | --------- 13 | $f_i$ | 743 | 394 | 245 | 190 | 144 | 127 | 115 | 104 | 90 | 81 | 1182 14 | 15 | 16 | ### Chao1 下界估計量 17 | 18 | 我們用 [R軟體](http://www.r-project.org/) 將上述表格繪製成以下示意圖,實心圓圈為樣本中出現 $i$ 次字彙的調查結果 $f_i$ ,而空心圓圈表示樣本中未出現的字彙數,其值未知並記為 $f_0$ 。令 $S$ 表示曹雪芹認識字彙的總數, $S_{obs} = \sum_{i} f_i$ 表示樣本中出現的字彙數,則以上常數滿足關係式 19 | 20 | $S = S_{obs} + f_0$ 21 | 22 | 因此,對於總字彙數 $S$ 的估計問題,可以等價於未知常數 $f_0$ 的估計。 23 | 24 | 25 | ```r 26 | fau <- cbind(1:10, c(743, 394, 245, 190, 144, 127, 115, 104, 90, 81)) 27 | par(lwd = 2, pch = 19, cex = 1.3) 28 | if (Sys.info()["sysname"] == "Darwin") par(family = "STKaiti") 29 | plot(fau, type = "b", main = "紅樓夢字彙頻率", xlab = "字彙出現次數 (i)", 30 | ylab = "字彙種類數 (fi)", xlim = c(0, 10), ylim = c(80, 900)) 31 | lines(c(0, 1), c(900, 743), lty = 3) 32 | points(0, 900, pch = 1, lwd = 2) 33 | ``` 34 | 35 | ![](../img/RFig1.jpg) 36 | 37 | 38 | 趙教授 (Chao, 1984) 的研究發現未出現的物種數 $f_0$ 與出現次數較稀少的物種 ( $f_1, f_2$ ) 息息相關,在已知樣本數為 $n$ 之下,證明出以下不等式 39 | 40 | $E(f_0) \geq \frac{n-1}{n} \frac{[E(f_1)]^2}{2E(f_2)}$ 41 | 42 | 其中符號 $E$ 表示對隨機變數 $f_i$ 取期望值。倘若 $n$ 夠大,則種類數的 Chao1 估計量為 43 | 44 | $\hat{S}_{Chao1} = S_{obs} + \frac{f_1^2}{2 f_2}$ 45 | 46 | 此外,由不等式的結果可知Chao1估計量必然小於等於真值,等號成立在每一種物種出現機率均相等的情況之下。經由若干計算得 $\hat{S}_{Chao1} = 3415 + 701 = 4116$ ,也就是說至少會應用 4116 種字彙,就可以當一個偉大的文學家(笑)。 47 | 48 | 49 | ### 種類數的累積曲線 50 | 51 | 要知道,樣本中出現的種類數和抽取的樣本數息息相關。一般而言樣本數越大,則樣本中被觀察到的種類數也越多。如何經由少數的樣本來預測再次進行更多的調查時,種類數累進的多寡也是相當重要的議題。所謂的種類數累進曲線,可以區分成兩個部分,小於參考樣本點的種類數內插,以及大於參考樣本點的種類數外插。Colwell et al. (2012) 將種類數依據樣本數的內插與外插分析方法稱作稀釋與預測曲線 (Rarefaction and extrapolation curve),並綜合前人的研究整合出曲線的估計方法。 52 | 53 | 種類數的稀釋與預測曲線可以透過Hsieh et al. (2013) [即本篇文章的第一作者] 所開發的R套件[iNEXT](https://github.com/JohnsonHsieh/iNEXT) (iNTerpolation and EXtrapolation) 進行計算。這裡介紹兩筆實際資料的應用:傳染病資料、英雄聯盟戰績資料。 54 | 55 | 第一筆資料取自於[衛生福利部疾病管制署](http://www.cdc.gov.tw/) 所提供的[2013年傳染疾病監測數據](http://www.cdc.gov.tw/list.aspx?treeid=1F07E8862BA550CF&nowtreeid=053A772AE8E9C869)做為例子,該數據提供2012, 2013年每週法定傳染病之確定病例數以及累計確定病例數。取2013年第20週的累計確定病例數據為參考樣本,該筆資料包含6210筆確定病例、35種法定傳染病。詳細的R指令如下所示,首先利用R套件[devtools](http://cran.r-project.org/web/packages/devtools/)安裝放置在[github](http://github.com/)上的[iNEXT](https://github.com/JohnsonHsieh/iNEXT)開發中版本。讀入筆者擷取自原始資料的.csv檔後,利用iNEXT()函數計算樣本數(確定病例人數)從1至15000的種類數,即法定傳染病數目。其中黑色實心圓圈表示第20週 (week20) 之樣本數與種類數的位置,黑色實線為種類數的內插、虛線為外插,淺色區域為95%信賴區間。而紅色X則是在第1, 5, 15, 20, 30, 44週的真實調查結果。透過本例的分析,可以發現利用前20週的病例資料進行稀釋與預測曲線分析不僅可以驗證前5週與15週的傳染病種類數結果,同時也準確的估計往後30週與44週的傳染病種類數。 56 | 57 | 58 | ```r 59 | # library(devtools) install_github('iNEXT','JohnsonHsieh') 60 | library(iNEXT) 61 | dat <- read.csv(url("http://dl.dropboxusercontent.com/u/26949459/2013%E5%82%B3%E6%9F%93%E7%97%85.csv", 62 | encoding = "big5"), row.names = 1) 63 | Sobs <- apply(dat, 2, function(x) sum(x > 0)) 64 | n <- apply(dat, 2, function(x) sum(x)) 65 | 66 | out <- iNEXT(dat$week20, datatype = "abundance", end = 15000) 67 | par(lwd = 2, pch = 19, cex = 1.3) 68 | plot.iNEXT(out, main = "Rarefaction/extrapolation at week20") 69 | points(n, Sobs, col = 2, pch = 4, cex = 1.5, lwd = 2) 70 | text(n, Sobs, colnames(dat), col = 2, pos = 1, cex = 1) 71 | ``` 72 | 73 | ![](../img/RFig2.jpg) 74 | 75 | 76 | 第二個例子取自線上資料庫[英雄聯盟戰績網](http://loltw.gamebase.com.tw/) 所提供召喚師在5v5的積分(團隊和個人)和一般遊戲中獲勝過的場次使用的英雄記錄。這個分析利用R套件Shiny (關於Shiny的介紹可以參見**[R 講題分享 – 利用 R 和 Shiny 製作網頁應用](http://programmermagazine.github.io/201309/htm/article6.html)** 這篇刊載於程式人2013年9月號的文章)以及iNEXT製作成 [英雄聯盟口袋深度分析](http://glimmer.rstudio.com/wush978/LOLChampion/) 的線上分析App供所有英雄聯盟的召喚師(玩家)使用。該App利用種類數的累積曲線計算每位召喚師戰鬥勝場數與使用英雄數目的關連曲線,有助於玩家本身或者是電競團隊追求更好表現的參考。 77 | 78 | ![LOLChampion](../img/LOLChampion.png) 79 | 80 | 81 | ### 結語 82 | 83 | 筆者在此展示了三種截然不同領域 (紅樓夢字彙資料、法定傳染病資料、電競遊戲資料) 的資料分析,主要用意在於說明種類數分析在各種領域中均有其重要性 (分析完這些資料也可以自稱是古典文學家、流行病學家甚至是電競專家了XDDD)。雖然本文在介紹方法的過程中省略的數學推導的過程,不過其背後主要的概念其實只是用到[柯西-施瓦茨不等式](http://zh.wikipedia.org/wiki/%E6%9F%AF%E8%A5%BF-%E6%96%BD%E7%93%A6%E8%8C%A8%E4%B8%8D%E7%AD%89%E5%BC%8F)以及[均值定理](http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%80%BC%E5%AE%9A%E7%90%86),有興趣的朋友可以參閱文獻:Chao (1984)、Sanders (1968) 與Shen et al. (2003)。 84 | 85 | 86 | ### 參考文獻 87 | - Chao, A. 1984. Nonparametric estimation of the number of classes in a population. Scandinavian Journal of Statistics 11:265-270. 88 | - Colwell, R. K., A. Chao, N. J. Gotelli, S. Y. Lin, C. X. Mao, R. L. Chazdon, and J. T. Longino. 2012. Models and estimators linking individual-based and sample-based rarefaction, extrapolation and comparison of assemblages. Journal of Plant Ecology 5:3-21. 89 | - Sanders, H. L. 1968. Marine benthic diversity: a comparative study. American Naturalist 102:243-282. 90 | - Shen, T. J., A. Chao, and C. F. Lin. 2003. Predicting the number of new species in further taxonomic sampling. Ecology 84:798-804. 91 | 92 | ### 作者 93 | 94 | #### T.C. (Johnson) Hsieh ([euler96@gmail.com](mailto:euler96@gmail.com)) 95 | - 清華統計所博士(2009-2013),致力於發展沒人懂的統計方法與開發沒人用的統計軟體 96 | * [Taiwan R User Group](https://www.facebook.com/Tw.R.User) Officer 97 | * [Data Science Program](http://datasci.co/) 籌備委員 98 | - R 相關著作: 99 | * R套件,[CARE1](http://cran.r-project.org/web/packages/CARE1/)主要作者 100 | * R套件,[iNEXT](http://github.com/JohnsonHsieh/iNEXT)主要作者 101 | * Shiny應用,[iNEXT-Online](http://glimmer.rstudio.com/tchsieh/inext/) 102 | - 研究領域:Statistics, ecology and genetics 103 | -------------------------------------------------------------------------------- /htm/message1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

14 |
15 |
16 | 21 |

歷史短訊:電玩遊戲的歷史

22 |

對於台灣的五年級 (民國 50 年代出生) 的朋友們而言,可能很多人都玩過那種小型的掌上遊戲機, 但是大部分的人可能不瞭解這類電動遊戲的歷史,在本期的程式人雜誌當中,我們會將焦點放在遊戲 與其相關產品的歷史介紹上。

23 |

1950 年代

24 |

電玩遊戲起源於 1950 年代,Thomas T. Goldsmith Jr. 與 Estle Ray Mann兩人是第一位申請遊戲機專利者, 描述了一個用了八顆真空管以模擬飛彈對目標發射,包括使用許多旋紐以調整飛彈航線與速度的遊戲裝置, 但是當時的顯示技術還不夠成熟,結果只好改用單層透明版畫當目標,所以這個遊戲機不太好用。

25 |

1951年,英國的 Christopher Strachey 寫出了西洋跳棋程式,1952年劍橋大學的 A.S. Douglas 發展出了 一個稱為《OXO》井字棋遊戲。1958年 William Higinbotham 利用示波器與類比電腦創造出了《雙人網球》遊戲。

26 |

1960 年代

27 |

1961年,美國的 Steve Russell 等學生,於麻省理工學院的一部 DEC PDP-1 電腦中寫了一個名為《宇宙戰爭》 (Spacewar!)的遊戲。後來這款遊戲還在早期的網際網路上發售。因此 Spacewar 被認為是第一個廣為 流傳及具影響力的電子遊戲。

28 |

1966年,Ralph Baer 發明了一個在標準電視上顯示的簡單電子遊戲:《追擊》(Chase)。 後來並幫助 Bill Harrison 一起製造了光線槍並於1967年與 Bill Rusch 共同開發了幾個電子遊戲。1968年他們發展出一個具有桌球及射擊等不同遊戲的原型機。

29 |

1969年,C 語言發明人之一的 Ken Thompson 寫了一個在 Multics 系統上運行的《太空旅行》 (Space Travel)遊戲。後來 Ken Thompson 改用 PDP-7 撰寫,結果寫著寫著就創造出了 UNIX 作業系統, 而《太空旅行》也就成了 UNIX 的第一個應用程式。

30 |

1970 年代

31 |

1971年9月,模仿《宇宙戰爭》的初代小蜜蜂遊戲(Galaxy Game)被安裝在史丹福大學的一個學生活動中心裏。 是第一個投幣式電子遊戲,而且該機器只有建造一部。

32 |

1971年, Nolan Bushnell 與 Ted Babney 建造了《宇宙戰爭》的投幣式街機版本,稱為《電腦空間》。 後來 Nutting Associates 取得該遊戲授權並大量製造了 1500 部,於 1971 年 11 月發行。 雖然該遊戲因各種困難而不太成功,但卻樹立了標竿,成為第一個大量製造並供商業銷售的電子遊戲。

33 |

有了上述的經驗, Nolan Bushnell 與 Ted Babney 兩人乾脆攜手於 1972 年創立了 Atari 公司, 並於同一年內就創造出 《乓》(Pong)這款遊戲,而且大獲成功,總共賣了19,000 部,以下是 Pong 這個遊戲 的畫面,或許您曾經玩過也說不定。

34 |
35 | 圖、Pong 遊戲的畫面

圖、Pong 遊戲的畫面

36 |
37 |

1977年,Atari發行了名為 Video Computer System (VCS) 卡匣為主的遊戲機,後來改稱Atari 2600, 設計了9款遊戲並在假期季節發行。它迅速成為所有早期遊戲機當中最受歡迎的一款。

38 |

後來日本開始踏進遊戲工業,1978年日本 TAITO 公司開發出的《太空侵略者》(Space Invaders)大賣, 遊戲產業開始進入美日兩國相互競爭的年代。

39 |

1979 年的小精靈《Pac-Man》第一個在主流文化上廣受歡迎,並且是第一個遊戲角色以其自己本身形象 獲得大眾肯定的遊戲。

40 |

1980 年代

41 |

街機黃金年代在1980年代到達了頂峰,很多在技術或類型上革新的遊戲在80年代前幾年紛紛出現。

42 |

《3D怪物迷宮》(3D Monster Maze,1981年)是家用電腦上的第一個三維遊戲,而《戴格拉斯地下城》(Dungeons of Daggorath,1982年)則再添加了各種類型的武器與怪物、細緻的音效、和一個「心跳」的血條。《一級方程式賽車》(Pole Position,1982年)。

43 |

1980年發行的《魔域》更進一步地使文字冒險遊戲在家用電腦上流行起來,並確立了開發商Infocom在這類型遊戲上的優勢。

44 |

1982年8月,Commodore 64公開發行。它因為強勢行銷與優越價位造成其一開始就賣得火紅。

45 |

1983年 SuperSet Software公司創造了《狙擊》(Snipes)這個文字模式的網路電腦遊戲,並在新的IBM PC架構下的電腦網路測試、展示遊戲功能。

46 |

1984年一個真正的現代冒險遊戲隨著雪樂山《國王密使》系列誕生。

47 |

BBS 在1980年代十分流行,因此有時被用來當作線上遊戲進行的平台。許多玩家透過 BBS 進行遊戲。遊戲類型從文字冒險到賭博遊戲如廿一點等。也有多人遊戲像是 MUD (Multi-User Dungeons) 等等,這些遊戲最終進化成今日眾所週知的 MMORPG(大型多人在線角色扮演遊戲)。

48 |

任天堂的 Game &Watch 生產線在 1980 年開始生產 LCD 可攜遊戲機。 後來很多廠商也開始做。它們的體積很小,有些可以像手錶一樣可載在手腕上。

49 |

電腦遊戲市場於 1984 年取代了家用機市場。1985年,北美的電子遊戲市場因任天堂在亞洲外被稱為任天堂娛樂系統(Nintendo Entertainment System,縮寫為NES)的8位元FC遊戲機(任天堂紅白機)的發行而復甦。該機隨機銷售《超級瑪利歐》,立即大賣。在新遊戲機裏,手柄取代了搖桿、旋鈕及keypad成為系統所包括的預設遊戲操縱器。一個備8個方向的指向柄(Directional-pad, D-pad)和2個或以上的行動鍵的手柄設計成為了當時的標準。

50 |

1986年《勇者鬥惡龍系列》第一部《勇者鬥惡龍 I》發行,在日本文化上造成有史以來的奇蹟,又稱國民RPG。

51 |

1990 年代

52 |

1990年代三維電腦圖像,伴隨著透過音效卡與光碟機的「多媒體」能力升級。1992年即時戰略遊戲(RTS)沙丘魔堡II發行。它當然絕不是該類型遊戲第一炮(許多其他遊戲足以被稱為非常原始的RTS,請參見即時戰略遊戲歷史),不過它為後來的票房RTS遊戲如魔獸爭霸、終極動員令、與星海爭霸定下了這類遊戲的標準技巧。

53 |

1990年代Maxis開始發行它成功的《模擬XX系列》,從《模擬城市》(Sim City)開始,以其它不同的變種作為延續,如《模擬地球》(Sim Earth)、《模擬城市2000》(Sim City 2000)、《模擬螞蟻》(Sim Antz)、《模擬大樓》(Sim Towers)及2000年推出、後來燴炙人口的日常生活模擬器──《模擬人生》(The Sims)。

54 |

1996年,隨著3dfx的Voodoo晶片上市,引領了第一個個人電腦上使用的平價3D加速卡。第一人稱射擊遊戲(如有名的《雷神之錘》)是其中第一個利用這新技術的。

55 |

任天堂64沿用了卡匣而非CD-ROM,此舉帶來了較高的成本並引起遊戲廠商的不滿。值得一提的是,史克威爾把之前由任天堂家機平台獨佔的《最終幻想》系列轉給了PlayStation;1997年《最終幻想VII》的巨大成功,使 PlayStation成為該類遊戲的主要平台,並帶動RPG的流行。

56 |

1998 年投入市場的Dreamcast,開啟了此世代的大門,但其銷路不佳,隨後在後繼機種出現前就淡出市場,SEGA 因此撤退到第三方遊戲開發市場。索尼以PlayStation 2 開啟新的紀元,該機器日後成為目前為止銷售最佳的家用機。

57 |

2000 年之後

58 |

在2001年年終之前,視窗作業系統暨專業生產力軟體巨擘微軟,挾家用機市場成熟與世嘉和任天堂的衰頹,以Xbox切入電子遊戲業。

59 |

隨著價廉物美的寬頻網際網路連線在全球普及,許多出版商轉向時間計費線上遊戲,作為一種創新嘗試。大型多人在線角色扮演遊戲(MMORPG)號召了許多作品的賣座,如《魔獸世界》(World of Warcraft)與《最終幻想XI》(Final Fantasy XI)。此類遊戲主打PC市場,Xbox透過其內建的網路介面分了一杯羹。而PS2與GameCube缺乏上線能力,兩者後來都有這類連網附加週邊發行,但反響效果不如xbox live。

60 |

2005年任天堂的 Wii Remote 成功的將手握型遙控體感裝置帶入家庭遊戲的領域,成為新一代家庭遊戲機的典範。

61 |

2010年,微軟推出了 Kinect 改用身體當作體感裝置,搶食了 Wii 的市場。

62 |

接著、蘋果推出的 iPad 大受歡迎,讓平板遊戲開始快速發展,整個世界進入了行動娛樂的新時代 .....

63 |

參考文獻

64 | 68 |

【本文由陳鍾誠取材並修改自 維基百科,採用創作共用的 姓名標示、相同方式分享 授權】

69 |
70 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /css/pmag.css: -------------------------------------------------------------------------------- 1 | html, body, div, span, applet, object, iframe, 2 | p, blockquote, pre, 3 | a, abbr, acronym, address, big, cite, code, 4 | del, dfn, em, img, ins, kbd, q, s, samp, 5 | small, strike, strong, sub, sup, tt, var, 6 | b, u, i, center, 7 | dl, dt, dd, 8 | fieldset, form, label, legend, 9 | table, caption, tbody, tfoot, thead, tr, th, td, 10 | article, aside, canvas, details, embed, 11 | figure, figcaption, footer, header, hgroup, 12 | menu, nav, output, ruby, section, summary, 13 | time, mark, audio, video { 14 | margin: 0; 15 | padding: 0; 16 | border: 0; 17 | font: inherit; 18 | vertical-align: baseline; 19 | line-height:160%; 20 | font-family: 'Tahoma', 'Pmingliu'; 21 | } 22 | 23 | #cover-image { 24 | width:100%; 25 | } 26 | 27 | div>ol.toc { 28 | list-style-type:disc; 29 | } 30 | 31 | ol.toc { 32 | list-style-type:circle; 33 | } 34 | 35 | blockquote { 36 | margin: 10px; 37 | padding-left: 10px; 38 | padding-right: 10px; 39 | padding-top: 1px; 40 | padding-bottom: 1px; 41 | border: 3px double #373737; 42 | color:#333333; 43 | // border: 1px solid #373737; 44 | // background-color: #efefef; 45 | } 46 | 47 | h1, h1 a { font-size: xx-large; color:#050505; text-align:center; margin:30px; font-weight: bold; font-family: 'Tahoma', 'DFKai-sb'; } 48 | 49 | h2, h2 a { font-size: x-large; color:#000033; margin-top:30px; margin-bottom:30px; font-weight: bold; font-family: 'Tahoma', 'DFKai-sb'; } 50 | 51 | h3, h3 a { font-size: large; color:#000066; font-weight: bold; font-family: 'Tahoma', 'DFKai-sb'; } 52 | 53 | h4, h4 a { font-size: medium; color:#4B0082; font-weight: bold; font-family: 'Tahoma', 'DFKai-sb'; } 54 | 55 | h5, h5 a { font-size: small ; color:#708090; font-weight: bold; font-family: 'Tahoma', 'DFKai-sb'; } 56 | 57 | h6, h6 a { font-size: x-small; color:#000080; } 58 | 59 | p { 60 | font-family: 'Tahoma', 'Pmingliu'; 61 | margin: 10px 0 15px 0; 62 | font-size:100%; 63 | color:#353535; 64 | } 65 | 66 | li { 67 | font-size:100%; 68 | } 69 | 70 | footer p { 71 | color: #f2f2f2; 72 | } 73 | 74 | a { 75 | text-decoration: none; 76 | color: #007edf; 77 | text-shadow: none; 78 | 79 | transition: color 0.5s ease; 80 | transition: text-shadow 0.5s ease; 81 | -webkit-transition: color 0.5s ease; 82 | -webkit-transition: text-shadow 0.5s ease; 83 | -moz-transition: color 0.5s ease; 84 | -moz-transition: text-shadow 0.5s ease; 85 | -o-transition: color 0.5s ease; 86 | -o-transition: text-shadow 0.5s ease; 87 | -ms-transition: color 0.5s ease; 88 | -ms-transition: text-shadow 0.5s ease; 89 | } 90 | 91 | table { 92 | border-collapse: collapse; 93 | border-spacing: 0; 94 | border: 1px solid #373737; 95 | margin-bottom: 20px; 96 | text-align: left; 97 | margin-left:auto; 98 | margin-right:auto; 99 | } 100 | 101 | th { 102 | padding: 10px; 103 | background-color:black; 104 | color:white; 105 | } 106 | 107 | td { 108 | padding: 10px; 109 | vertical-align: middle; 110 | border: 1px solid #373737; 111 | } 112 | 113 | em { 114 | font-weight:bold; 115 | } 116 | 117 | #header_wrap { 118 | margin: 0; 119 | padding: 16px; 120 | border: 0; 121 | font: inherit; 122 | vertical-align: baseline; 123 | background-color:black; 124 | color:white; 125 | } 126 | 127 | #header_wrap h1, #header_wrap h1 sub, #header_wrap h1 a { 128 | color:white; 129 | font-family: 'Tahoma', 'DFKai-sb'; 130 | } 131 | 132 | #header_wrap sub { 133 | color:white; 134 | font-size:60%; 135 | } 136 | 137 | .title, .author, .date { 138 | color:#333333; 139 | text-align:center; 140 | font-family: 'Tahoma', 'DFKai-sb'; 141 | } 142 | 143 | .title { font-size:xx-large; line-height:800%; } 144 | 145 | .author { font-size:large; line-height:300%; } 146 | 147 | .date { font-size:large; line-height:300%; } 148 | 149 | 150 | #content { 151 | margin:10px; 152 | padding:10px; 153 | } 154 | 155 | pre { 156 | border: 1px solid #373737; 157 | background-color:#efefef; 158 | color:#3f3f3f; 159 | font-size:medium; 160 | width:95%; 161 | padding:10px; 162 | /* wrap ,自動換行 */ 163 | white-space: pre-wrap; /* css-3 */ 164 | white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ 165 | white-space: -pre-wrap; /* Opera 4-6 */ 166 | white-space: -o-pre-wrap; /* Opera 7 */ 167 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 168 | } 169 | 170 | code { 171 | font-family: SimSun; 172 | font-size:125%; 173 | } 174 | 175 | .figure { 176 | margin:10px; 177 | padding:10px; 178 | margin-left: auto; 179 | margin-right: auto; 180 | display: block; 181 | } 182 | 183 | img { vertical-align:middle; } 184 | 185 | .figure img { 186 | // border: 1px solid #373737; 187 | margin-left: auto; 188 | margin-right: auto; 189 | display: block; 190 | } 191 | 192 | .figure .caption { 193 | text-align:center; 194 | } 195 | 196 | #TOC { 197 | } 198 | 199 | #footer { 200 | text-align:center; 201 | font-size:small; 202 | color:#6f6f6f; 203 | margin: 10px; 204 | padding: 10px; 205 | } 206 | 207 | /* JavaScript Style */ 208 | table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode { 209 | margin: 0; padding: 0; vertical-align: baseline; border: none; } 210 | table.sourceCode { width: 100%; } 211 | td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #afafaf; border-right: 1px solid #aaaaaa; } 212 | td.sourceCode { padding-left: 5px; } 213 | code > span.kw { color: #007020; font-weight: bold; } 214 | code > span.dt { color: #902000; } 215 | code > span.dv { color: #40a070; } 216 | code > span.bn { color: #40a070; } 217 | code > span.fl { color: #40a070; } 218 | code > span.ch { color: #4070a0; } 219 | code > span.st { color: #4070a0; } 220 | code > span.co { color: #60a0b0; font-style: italic; } 221 | code > span.ot { color: #007020; } 222 | code > span.al { color: #ff0000; font-weight: bold; } 223 | code > span.fu { color: #06287e; } 224 | code > span.er { color: #ff0000; font-weight: bold; } 225 | 226 | -------------------------------------------------------------------------------- /source/article6.md: -------------------------------------------------------------------------------- 1 | ## R 講題分享 - 種類數的估計與預測 2 | 3 | ### 簡介 4 | 5 | 關於一個集合內部種類數的估計問題,在各種領域中廣泛的討論。譬如:戶政機關的人口數估計、流行病學中的罹病人數估計、生態學中的物種數估計、程式設計中的臭蟲數估計、考古學中的器皿數估計、古典文學中的作家字彙數估計等等。任職於清華統計所的 [趙蓮菊](http://chao.stat.nthu.edu.tw/) 教授是國際間研究種類數估計的大師,本文將簡單的介紹趙教授關於種類數估計問題所發展的統計方法。 6 | 7 | ### 研究問題與資料格式 8 | 9 | 為了得知集合中的種類數,勢必透過抽樣資料來估計。本文舉李蕙帆 (2008) 對於曹雪芹先生所撰寫的經典名著紅樓夢做為例子,假定欲探討的集合為文學大家曹雪芹先生所認識的字彙,則紅樓夢前80回 (一般認為120回的紅樓夢,前80回為曹雪芹所作,後40回為他人續作) 可視為曹先生認識字彙的抽樣結果,下表為種類數調查數據的基本格式,即曹雪芹在紅樓夢前80回的用字頻率,fi 表示小說中出現i次的字彙數目: 10 | 11 | i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 10up 12 | ------|-----|-----|-----|-----|-----|-----|-----|-----|-----| --- | --------- 13 | ![](../timg/59bdf0ba696e.jpg) | 743 | 394 | 245 | 190 | 144 | 127 | 115 | 104 | 90 | 81 | 1182 14 | 15 | 16 | ### Chao1 下界估計量 17 | 18 | 我們用 [R軟體](http://www.r-project.org/) 將上述表格繪製成以下示意圖,實心圓圈為樣本中出現 ![](../timg/865c0c0b4ab0.jpg) 次字彙的調查結果 ![](../timg/59bdf0ba696e.jpg) ,而空心圓圈表示樣本中未出現的字彙數,其值未知並記為 ![](../timg/78155d2ec4b0.jpg) 。令 ![](../timg/5dbc98dcc983.jpg) 表示曹雪芹認識字彙的總數, ![](../timg/7d433fbb1182.jpg) 表示樣本中出現的字彙數,則以上常數滿足關係式 19 | 20 | ![](../timg/01dba172fdeb.jpg) 21 | 22 | 因此,對於總字彙數 ![](../timg/5dbc98dcc983.jpg) 的估計問題,可以等價於未知常數 ![](../timg/78155d2ec4b0.jpg) 的估計。 23 | 24 | 25 | ```r 26 | fau <- cbind(1:10, c(743, 394, 245, 190, 144, 127, 115, 104, 90, 81)) 27 | par(lwd = 2, pch = 19, cex = 1.3) 28 | if (Sys.info()["sysname"] == "Darwin") par(family = "STKaiti") 29 | plot(fau, type = "b", main = "紅樓夢字彙頻率", xlab = "字彙出現次數 (i)", 30 | ylab = "字彙種類數 (fi)", xlim = c(0, 10), ylim = c(80, 900)) 31 | lines(c(0, 1), c(900, 743), lty = 3) 32 | points(0, 900, pch = 1, lwd = 2) 33 | ``` 34 | 35 | ![](../img/RFig1.jpg) 36 | 37 | 38 | 趙教授 (Chao, 1984) 的研究發現未出現的物種數 ![](../timg/78155d2ec4b0.jpg) 與出現次數較稀少的物種 ( ![](../timg/537e42306196.jpg) ) 息息相關,在已知樣本數為 ![](../timg/7b8b965ad4bc.jpg) 之下,證明出以下不等式 39 | 40 | ![](../timg/2bc64e7b7791.jpg) 41 | 42 | 其中符號 ![](../timg/3a3ea00cfc35.jpg) 表示對隨機變數 ![](../timg/59bdf0ba696e.jpg) 取期望值。倘若 ![](../timg/7b8b965ad4bc.jpg) 夠大,則種類數的 Chao1 估計量為 43 | 44 | ![](../timg/a82e036aca4f.jpg) 45 | 46 | 此外,由不等式的結果可知Chao1估計量必然小於等於真值,等號成立在每一種物種出現機率均相等的情況之下。經由若干計算得 ![](../timg/bbe5b9e9cfa0.jpg) ,也就是說至少會應用 4116 種字彙,就可以當一個偉大的文學家(笑)。 47 | 48 | 49 | ### 種類數的累積曲線 50 | 51 | 要知道,樣本中出現的種類數和抽取的樣本數息息相關。一般而言樣本數越大,則樣本中被觀察到的種類數也越多。如何經由少數的樣本來預測再次進行更多的調查時,種類數累進的多寡也是相當重要的議題。所謂的種類數累進曲線,可以區分成兩個部分,小於參考樣本點的種類數內插,以及大於參考樣本點的種類數外插。Colwell et al. (2012) 將種類數依據樣本數的內插與外插分析方法稱作稀釋與預測曲線 (Rarefaction and extrapolation curve),並綜合前人的研究整合出曲線的估計方法。 52 | 53 | 種類數的稀釋與預測曲線可以透過Hsieh et al. (2013) [即本篇文章的第一作者] 所開發的R套件[iNEXT](https://github.com/JohnsonHsieh/iNEXT) (iNTerpolation and EXtrapolation) 進行計算。這裡介紹兩筆實際資料的應用:傳染病資料、英雄聯盟戰績資料。 54 | 55 | 第一筆資料取自於[衛生福利部疾病管制署](http://www.cdc.gov.tw/) 所提供的[2013年傳染疾病監測數據](http://www.cdc.gov.tw/list.aspx?treeid=1F07E8862BA550CF&nowtreeid=053A772AE8E9C869)做為例子,該數據提供2012, 2013年每週法定傳染病之確定病例數以及累計確定病例數。取2013年第20週的累計確定病例數據為參考樣本,該筆資料包含6210筆確定病例、35種法定傳染病。詳細的R指令如下所示,首先利用R套件[devtools](http://cran.r-project.org/web/packages/devtools/)安裝放置在[github](http://github.com/)上的[iNEXT](https://github.com/JohnsonHsieh/iNEXT)開發中版本。讀入筆者擷取自原始資料的.csv檔後,利用iNEXT()函數計算樣本數(確定病例人數)從1至15000的種類數,即法定傳染病數目。其中黑色實心圓圈表示第20週 (week20) 之樣本數與種類數的位置,黑色實線為種類數的內插、虛線為外插,淺色區域為95%信賴區間。而紅色X則是在第1, 5, 15, 20, 30, 44週的真實調查結果。透過本例的分析,可以發現利用前20週的病例資料進行稀釋與預測曲線分析不僅可以驗證前5週與15週的傳染病種類數結果,同時也準確的估計往後30週與44週的傳染病種類數。 56 | 57 | 58 | ```r 59 | # library(devtools) install_github('iNEXT','JohnsonHsieh') 60 | library(iNEXT) 61 | dat <- read.csv(url("http://dl.dropboxusercontent.com/u/26949459/2013%E5%82%B3%E6%9F%93%E7%97%85.csv", 62 | encoding = "big5"), row.names = 1) 63 | Sobs <- apply(dat, 2, function(x) sum(x > 0)) 64 | n <- apply(dat, 2, function(x) sum(x)) 65 | 66 | out <- iNEXT(dat$week20, datatype = "abundance", end = 15000) 67 | par(lwd = 2, pch = 19, cex = 1.3) 68 | plot.iNEXT(out, main = "Rarefaction/extrapolation at week20") 69 | points(n, Sobs, col = 2, pch = 4, cex = 1.5, lwd = 2) 70 | text(n, Sobs, colnames(dat), col = 2, pos = 1, cex = 1) 71 | ``` 72 | 73 | ![](../img/RFig2.jpg) 74 | 75 | 76 | 第二個例子取自線上資料庫[英雄聯盟戰績網](http://loltw.gamebase.com.tw/) 所提供召喚師在5v5的積分(團隊和個人)和一般遊戲中獲勝過的場次使用的英雄記錄。這個分析利用R套件Shiny (關於Shiny的介紹可以參見**[R 講題分享 – 利用 R 和 Shiny 製作網頁應用](http://programmermagazine.github.io/201309/htm/article6.html)** 這篇刊載於程式人2013年9月號的文章)以及iNEXT製作成 [英雄聯盟口袋深度分析](http://glimmer.rstudio.com/wush978/LOLChampion/) 的線上分析App供所有英雄聯盟的召喚師(玩家)使用。該App利用種類數的累積曲線計算每位召喚師戰鬥勝場數與使用英雄數目的關連曲線,有助於玩家本身或者是電競團隊追求更好表現的參考。 77 | 78 | ![LOLChampion](../img/LOLChampion.png) 79 | 80 | 81 | ### 結語 82 | 83 | 筆者在此展示了三種截然不同領域 (紅樓夢字彙資料、法定傳染病資料、電競遊戲資料) 的資料分析,主要用意在於說明種類數分析在各種領域中均有其重要性 (分析完這些資料也可以自稱是古典文學家、流行病學家甚至是電競專家了XDDD)。雖然本文在介紹方法的過程中省略的數學推導的過程,不過其背後主要的概念其實只是用到[柯西-施瓦茨不等式](http://zh.wikipedia.org/wiki/%E6%9F%AF%E8%A5%BF-%E6%96%BD%E7%93%A6%E8%8C%A8%E4%B8%8D%E7%AD%89%E5%BC%8F)以及[均值定理](http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%80%BC%E5%AE%9A%E7%90%86),有興趣的朋友可以參閱文獻:Chao (1984)、Sanders (1968) 與Shen et al. (2003)。 84 | 85 | 86 | ### 參考文獻 87 | - Chao, A. 1984. Nonparametric estimation of the number of classes in a population. Scandinavian Journal of Statistics 11:265-270. 88 | - Colwell, R. K., A. Chao, N. J. Gotelli, S. Y. Lin, C. X. Mao, R. L. Chazdon, and J. T. Longino. 2012. Models and estimators linking individual-based and sample-based rarefaction, extrapolation and comparison of assemblages. Journal of Plant Ecology 5:3-21. 89 | - Sanders, H. L. 1968. Marine benthic diversity: a comparative study. American Naturalist 102:243-282. 90 | - Shen, T. J., A. Chao, and C. F. Lin. 2003. Predicting the number of new species in further taxonomic sampling. Ecology 84:798-804. 91 | 92 | ### 作者 93 | 94 | #### T.C. (Johnson) Hsieh ([euler96@gmail.com](mailto:euler96@gmail.com)) 95 | - 清華統計所博士(2009-2013),致力於發展沒人懂的統計方法與開發沒人用的統計軟體 96 | * [Taiwan R User Group](https://www.facebook.com/Tw.R.User) Officer 97 | * [Data Science Program](http://datasci.co/) 籌備委員 98 | - R 相關著作: 99 | * R套件,[CARE1](http://cran.r-project.org/web/packages/CARE1/)主要作者 100 | * R套件,[iNEXT](http://github.com/JohnsonHsieh/iNEXT)主要作者 101 | * Shiny應用,[iNEXT-Online](http://glimmer.rstudio.com/tchsieh/inext/) 102 | - 研究領域:Statistics, ecology and genetics 103 | -------------------------------------------------------------------------------- /source/discuss1.md: -------------------------------------------------------------------------------- 1 | ## 討論:如何用 Respberry Pi 插一根電線就能發送 FM 訊號 2 | 3 | 網友 Albert Huang 分享了一個很有趣的網頁,說到可以用一個稱為 PiFm 的程式,讓 Respberry Pi 將 wav 的聲音檔 4 | 透過在 GPIO 4 上插一根導線,就可以發送出該聲音的 FM 電磁波訊號。 5 | 6 | * [Raspberry Pi Hacks - Turn your Raspberry Pi into a FM Transmitter – Hack Radio Frequencies](http://raspberrypi-hacks.com/7/turn-your-raspberry-pi-into-a-fm-transmitter-hack-radio-frequencies/) 7 | 8 | Albert Huang 的說明如下: 9 | 10 | > 用 Raspberry GPIO 4 的 Alt1 功能(GPCLK0)來傳送 FM 訊號,利用了因為頻寬限制, GPCLK0 超過 75MHz 之後,就會由方波而愈來愈接近正弦波的原理,而 FM 就是依據輸入的聲音大小來改變 FM 的載波頻率。 11 | 12 | 以下是在程式人雜誌社團中的原始討論: 13 | 14 | * 15 | 16 | 為了更清楚瞭解到底這是如何運作的,我找到了以下兩個影片,應該可以很清楚的看到運作的過程。 17 | 18 | * [YouTube:Turning the Raspberry Pi into an FM transmitter with PiFM](http://youtu.be/blvaYR6aYXA) 19 | * [YouTube:Raspberry Pi as FM Transmitter](http://youtu.be/ekcdAX53-S8) 20 | 21 | 看完這兩個影片之後,我真的很想知道他是怎麼做的,所以我找到該模組的用法與原始程式下載點: 22 | 23 | * 用法: [Turning the Raspberry Pi Into an FM Transmitter](http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter) 24 | 25 | * 程式碼下載點: 26 | 27 | 使用方法如下: 28 | 29 | ``` 30 | sudo python 31 | >>> import PiFm 32 | >>> PiFm.play_sound("sound.wav") 33 | ``` 34 | 35 | PiFm 模組的程式總共包含兩個部份,分別是 Python (PyFm.py) 與 C (PyFm.c) 的程式,但我想主要的重點是 C 的程式,以下是我認為關鍵的部份。 36 | 37 | ```CPP 38 | void playWav(char* filename, float samplerate) 39 | { 40 | int fp= STDIN_FILENO; 41 | if(filename[0]!='-') fp = open(filename, 'r'); 42 | //int sz = lseek(fp, 0L, SEEK_END); 43 | //lseek(fp, 0L, SEEK_SET); 44 | //short* data = (short*)malloc(sz); 45 | //read(fp, data, sz); 46 | 47 | int bufPtr=0; 48 | float datanew, dataold = 0; 49 | short data; 50 | 51 | for (int i=0; i<22; i++) // 掠過 wav 檔的表頭 52 | read(fp, &data, 2); // read past header 53 | 54 | while (read(fp, &data, 2)) { 55 | // fmconstant = 22500 * 50e-6 = 1.125 56 | float fmconstant = samplerate * 50.0e-6; // for pre-emphisis filter. 50us time constant 57 | // wav 取樣頻率一般有11025Hz(11kHz) ,22050Hz(22kHz) 和44100Hz(44kHz)三種,此檔案用 22050Hz 58 | int clocksPerSample = 22500.0/samplerate*1400.0; // for timing 59 | // 主程式中有 playWav(argv[1], argc>3?atof(argv[3]):22500); 60 | // 所以 22500.0/samplerate = 1, 於是 clocksPerSample =1400,也就是最小震盪週期會被取 1400 次樣本。 61 | 62 | datanew = (float)(data)/32767; // 將資料 data 轉為浮點數 63 | 64 | float sample = datanew + (dataold-datanew) / (1-fmconstant); // fir of 1 + s tau 65 | float dval = sample*15.0; // actual transmitted sample. 15 is bandwidth (about 75 kHz) 66 | 67 | int intval = (int)(round(dval)); // integer component 68 | float frac = (dval - (float)intval)/2 + 0.5; 69 | unsigned int fracval = frac*clocksPerSample; 70 | 71 | bufPtr++; 72 | // 用直接記憶體映射 DMA 的方法,將資料往 GPIO4 的 allof7e 輸出 73 | // 參考: 树莓派处理器BCM2835的DMA -- http://www.lijingquan.net/dma-bcm2835-rpi.html 74 | while( ACCESS(DMABASE + 0x04 /* CurBlock*/) == (int)(instrs[bufPtr].p)) usleep(1000); 75 | 76 | ((struct CB*)(instrs[bufPtr].v))->SOURCE_AD = (int)constPage.p + 2048 + intval*4 - 4 ; 77 | 78 | bufPtr++; 79 | while( ACCESS(DMABASE + 0x04 /* CurBlock*/) == (int)(instrs[bufPtr].p)) usleep(1000); 80 | ((struct CB*)(instrs[bufPtr].v))->TXFR_LEN = clocksPerSample-fracval; 81 | 82 | bufPtr++; 83 | while( ACCESS(DMABASE + 0x04 /* CurBlock*/) == (int)(instrs[bufPtr].p)) usleep(1000); 84 | ((struct CB*)(instrs[bufPtr].v))->SOURCE_AD = (int)constPage.p + 2048 + intval*4+4; 85 | 86 | bufPtr=(bufPtr+1) % (1024); 87 | while( ACCESS(DMABASE + 0x04 /* CurBlock*/) == (int)(instrs[bufPtr].p)) usleep(1000); 88 | ((struct CB*)(instrs[bufPtr].v))->TXFR_LEN = fracval; 89 | 90 | dataold = datanew; 91 | } 92 | close(fp); 93 | } 94 | 95 | ``` 96 | 97 | 然後我找到維基百科的調頻原理,理面有解說如何將訊號用調頻的方式調變的概念,連結如下: 98 | 99 | * [維基百科:頻率調變](http://zh.wikipedia.org/wiki/%E9%A2%91%E7%8E%87%E8%B0%83%E5%88%B6) 100 | 101 | ![圖、FM 調頻的原理](../img/Frequency-modulation.png) 102 | 103 | 104 | 但是,要如何用 Raspberry Pi 去送出經過調頻的方式調變的訊號呢?經過我研究與查詢後,我發現 PiFm 好像是利用 105 | GPIO4 裏面的「脈衝寬度調變」(Pulse Width Modulation, PWM) 功能 (Alt1 , GPCLK0),來輸出 FM 調變過後的訊號。 106 | 107 | 例如下列的 raspberry-gpio-python 專案就有之援類似的功能。 108 | 109 | * raspberry-gpio-python -- 110 | 111 | 因此、我們必須瞭解一下何謂 PWM,以下維基百科的解釋與圖片說明了這項功能的原理。 112 | 113 | ![圖、PWM 脈衝寬度調變的原理](../img/PWM.jpg) 114 | 115 | > 與類比電路不同,數字電路是在預先確定的範圍內取值,在任何時刻,其輸出只可能為ON和OFF兩種狀態,所以電壓或電流會通/斷方式的重複脈衝序列載入到類比負載。PWM技術是一種對類比信號電平的數字編碼方法,通過使用高解析度計數器(調製頻率)調製方波的占空比,從而實現對一個類比信號的電平進行編碼。 116 | > 117 | > 類比信號能否使用PWM進行編碼調製,僅依賴頻寬,這即意味著只要有足夠的頻寬,任何類比信號值均可以採用PWM技術進行調製編碼,一般而言,負載需要的調製頻率要高於10Hz,在實際應用中,頻率約在1kHz到200kHz之間。 118 | 119 | 程式可以透過對 PWM port 輸出 (Frequency, Duty cycle) 兩個參數的方式,控制訊號的 PWM 調變,以下文章與影片有較詳細的說明。 120 | 121 | * [Raspberry pi has PWM pins](http://developmentboards.blogspot.tw/2013/04/rpigpio-052a-now-has-software-pwm-how.html), Posted by praveen kumar at 07:05 122 | * [YouTube:Using PWM with RPi.GPIO and Python on the Raspberry Pi](http://youtu.be/BLtV0Z38S94) 123 | 124 | 我想 PiFm 就是利用這個功能,對 GPCLK0 輸出不同的方波 (圖中藍色 V 的部份),這些方波會控制 PWM 讓它輸出紅色的波形,這些紅色的波形會近似 wav 檔內所代表的波形,於是就能將 wav 檔的聲音以 FM 的方式傳送出去了。 125 | 126 | 透過上述方式,我們可以用 respberry Pi 裏 「CPU+程式」的方式,輸出訊息給 PWM port ,以便將 wav 檔中的訊號,用 FM 的方式調變後輸出,於是「程式人」也可以學如何用 Raspberry Pi 發送「電磁波」,不需要靠額外的板子或 IC 了。 127 | 128 | 這種做法真棒! 129 | 130 | ### 參考文獻 131 | * [树莓派处理器BCM2835的DMA](http://www.lijingquan.net/dma-bcm2835-rpi.html) 132 | * [維基百科:頻率調變](http://zh.wikipedia.org/wiki/%E9%A2%91%E7%8E%87%E8%B0%83%E5%88%B6) , (FM) 133 | * [維基百科:脈衝寬度調變](http://zh.wikipedia.org/wiki/%E8%84%88%E8%A1%9D%E5%AF%AC%E5%BA%A6%E8%AA%BF%E8%AE%8A) 134 | * [RPIO.PWM, PWM via DMA for the Raspberry Pi](http://pythonhosted.org/RPIO/pwm_py.html) 135 | * [Raspberry pi has PWM pins](http://developmentboards.blogspot.tw/2013/04/rpigpio-052a-now-has-software-pwm-how.html) 136 | * [PiHAT - Rasberry Pi Home Automation Transmitter](http://www.skagmo.com/page.php?p=projects/22_pihat) 137 | * [Using a Raspberry Pi as an AirPlay Receiver](http://mac.tutsplus.com/tutorials/electronics/using-a-raspberry-pi-as-an-airplay-receiver/) 138 | 139 | -------------------------------------------------------------------------------- /htm/article1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 28 | 29 | 30 | 31 |
32 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

33 |
34 |
35 | 40 |

Arduino入門教學(12) – 使用可變電阻控制伺服馬達 (作者:Cooper Maa)

41 |

實驗目的

42 |

練習用可變電阻控制伺服馬達(Servo motor)的旋轉角度。

43 |
44 | 45 |
46 |

材料

47 |
    48 |
  • 麵包板 x 1
  • 49 |
  • Arduino 主板 x 1
  • 50 |
  • 伺服馬達(Servo Motor) x 1
  • 51 |
  • 10k 可變電阻 x 1
  • 52 |
  • 單心線 x N
  • 53 |
54 |

接線

55 |

伺服馬達有三條線,電源(紅線)、接地(黑線),以及訊號線。

56 |
57 | 58 |
59 |

把伺服馬達紅線接到 +5v,黑線接到 GND,訊號線接到 pin 9 可變電阻中間腳位接到類比輸入(Analog Input) pin 0,剩下的兩支腳位,一支接到 5V,另外一支接到 GND

60 |
61 | 62 |
63 |

電路圖

64 |
65 | 66 |
67 |

程式碼

68 |

RC 伺服馬達(Radio Controlled Servo Motor) 大部份是透過 PWM (Pulse Width Modulation, 脈波寬度調變)來控制,Arduino 裏內建了 Servo Library 讓事情變得很簡單,就算你對 PWM 不熟,也可以很輕鬆地控制伺服馬達。底下的程式碼示範 Servo Library 的使用方法(Servo.pde):

69 |
// 引用 Servo Library
 70 | #include <Servo.h> 
 71 |  
 72 | // 建立一個 Servo 物件
 73 | Servo myservo;
 74 | // 旋轉角度
 75 | int value = 0;
 76 |  
 77 | void setup() 
 78 | { 
 79 |   myservo.attach(9);  // Servo 接在 pin 9
 80 | } 
 81 |  
 82 | void loop() 
 83 | { 
 84 |   if (value == 0) 
 85 |     value = 180;
 86 |   else
 87 |     value = 0;
 88 |   
 89 |   // 叫 Servo 旋轉角度:
 90 |   //    myservo.write(0) 是叫 Servo 旋轉到 0 度的位置
 91 |   //    myservo.write(180) 是叫 Servo 旋轉到 180 度的位置
 92 |   myservo.write(value); 
 93 |   delay(1500);
 94 | } 
95 |

程式說明:

96 |
    97 |
  • L2: 引用 Servo library
  • 98 |
  • L5: 利用 Servo 類別建立 myservo 物件
  • 99 |
  • L24: 要控制 Servo 旋轉角度,只要呼叫 Servo 的 write() 並傳入指定的角度就可以了,例如 myservo.write(180) 是控制 Servo 轉到 180 度,myservo.write(120) 是控制 Servo 轉到 120 度。 使用可變電阻控制伺服馬達(PotServo.pde):
  • 100 |
101 |
// 使用可變電阻控制 Servo 的旋轉角度
102 | // by Michal Rinott <http://people.interaction-ivrea.it/m.rinott> 
103 | 
104 | // 引用 Servo Library
105 | #include <Servo.h> 
106 | 
107 | // 建立一個 Servo 物件 
108 | Servo myservo; 
109 |  
110 | // 可變電阻接在 Analog pin 0 
111 | int potpin = 0;
112 | // 儲存旋轉角度的變數
113 | int val;
114 |  
115 | void setup() 
116 | { 
117 |   myservo.attach(9);  // Servo 接在 pin 9
118 | } 
119 |  
120 | void loop() 
121 | { 
122 |   val = analogRead(potpin);            // 讀取可變電阻(數值介於 0 到 1023)
123 |   val = map(val, 0, 1023, 0, 179);     // 把 0 - 1023 的數值按比例縮放為 0 - 180 的數值
124 |   myservo.write(val);                  // 設定 Servo 旋轉角度
125 |   delay(15);                           // 等待 Servo 旋轉指定的位置
126 | }
127 |

程式說明:

128 |
    129 |
  • L22: 讀取可變電阻並將讀到的數值(介於 0 到 0123)儲存在 val 變數中
  • 130 |
  • L23: 0 到 1023 的數值必須經過數值轉換,依比例轉為 0 到 180 的數值,因為我們的伺服馬達只能在 0 到 180 度之間旋轉。範例程式利用 map() 函式將 0 – 1023 的值對應到 0 -179。
  • 131 |
  • L24: 根據讀到的可變電阻值控制 Servo 轉到指定的角度
  • 132 |
133 |

範例照片/影片

134 |

請參考 makezine.com 做的這個影片,影片除了示範伺服馬達的控制外,也講解了線路的接法以及程式碼:

135 | 138 |

延伸閱讀

139 | 145 |

【本文作者為馬萬圳,原文網址為: http://coopermaa2nd.blogspot.tw/2011/01/arduino-lab16.html ,由陳鍾誠編輯後納入本雜誌】

146 |
147 | 150 | 151 | 152 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-Figure.log: -------------------------------------------------------------------------------- 1 | This is pdfTeX, Version 3.1415926-1.40.11 (TeX Live 2010) (format=latex 2011.6.30) 7 APR 2012 21:56 2 | entering extended mode 3 | restricted \write18 enabled. 4 | %&-line parsing enabled. 5 | **\input Ma-Type1-Figure.tex 6 | (./Ma-Type1-Figure.tex 7 | (/usr/local/texlive/2010/texmf-dist/tex/latex/base/article.cls 8 | Document Class: article 2007/10/19 v1.4h Standard LaTeX document class 9 | (/usr/local/texlive/2010/texmf-dist/tex/latex/base/size10.clo 10 | File: size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option) 11 | ) 12 | \c@part=\count79 13 | \c@section=\count80 14 | \c@subsection=\count81 15 | \c@subsubsection=\count82 16 | \c@paragraph=\count83 17 | \c@subparagraph=\count84 18 | \c@figure=\count85 19 | \c@table=\count86 20 | \abovecaptionskip=\skip41 21 | \belowcaptionskip=\skip42 22 | \bibindent=\dimen102 23 | ) 24 | (/usr/local/texlive/2010/texmf-dist/tex/latex/pstricks/pstricks.sty 25 | Package: pstricks 2010/06/17 v0.45 LaTeX wrapper for `PSTricks' (RN,HV) 26 | 27 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pstricks/pstricks.tex 28 | (/usr/local/texlive/2010/texmf-dist/tex/generic/xkeyval/pst-xkey.tex 29 | File: pst-xkey.tex 2005/11/25 v1.6 PSTricks specialization of xkeyval (HA) 30 | 31 | (/usr/local/texlive/2010/texmf-dist/tex/latex/xkeyval/xkeyval.sty 32 | Package: xkeyval 2008/08/13 v2.6a package option processing (HA) 33 | 34 | (/usr/local/texlive/2010/texmf-dist/tex/generic/xkeyval/xkeyval.tex 35 | \XKV@toks=\toks14 36 | \XKV@tempa@toks=\toks15 37 | \XKV@depth=\count87 38 | File: xkeyval.tex 2008/08/13 v2.6a key=value parser (HA) 39 | 40 | (/usr/local/texlive/2010/texmf-dist/tex/generic/xkeyval/keyval.tex)))) 41 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pstricks/pst-fp.tex 42 | `pst-fp' v0.06, 2010/05/14 (hv) 43 | \pstFP@xs=\count88 44 | \pstFP@xia=\count89 45 | \pstFP@xib=\count90 46 | \pstFP@xfa=\count91 47 | \pstFP@xfb=\count92 48 | \pstFP@rega=\count93 49 | \pstFP@regb=\count94 50 | \pstFP@regs=\count95 51 | \pstFP@times=\count96 52 | ) 53 | \psLoopIndex=\count97 54 | 55 | `PSTricks' v2.08 <2010/06/06> (tvz) 56 | \pst@dima=\dimen103 57 | \pst@dimb=\dimen104 58 | \pst@dimc=\dimen105 59 | \pst@dimd=\dimen106 60 | \pst@dimg=\dimen107 61 | \pst@dimh=\dimen108 62 | \pst@dimm=\dimen109 63 | \pst@dimn=\dimen110 64 | \pst@dimo=\dimen111 65 | \pst@dimp=\dimen112 66 | \pst@hbox=\box26 67 | \pst@boxg=\box27 68 | \pst@cnta=\count98 69 | \pst@cntb=\count99 70 | \pst@cntc=\count100 71 | \pst@cntd=\count101 72 | \pst@cntg=\count102 73 | \pst@cnth=\count103 74 | \pst@cntm=\count104 75 | \pst@cntn=\count105 76 | \pst@cnto=\count106 77 | \pst@cntp=\count107 78 | \@zero=\count108 79 | \pst@toks=\toks16 80 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pstricks/pstricks.con) 81 | \psunit=\dimen113 82 | \psxunit=\dimen114 83 | \psyunit=\dimen115 84 | \pslinewidth=\dimen116 85 | \pst@customdefs=\toks17 86 | \pslinearc=\dimen117 87 | \pst@symbolStep=\dimen118 88 | \pst@symbolWidth=\dimen119 89 | \everypsbox=\toks18 90 | \psframesep=\dimen120 91 | \pslabelsep=\dimen121 92 | \pst@shift=\dimen122 93 | \theoverlaybox=\box28 94 | ) 95 | File: pstricks.tex 2010/06/06 v2.08 `PSTricks' (tvz,hv) 96 | 97 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pstricks/pst-fp.tex) 98 | File: pst-fp.tex 2010/06/06 v2.08 `PST-fp' (hv) 99 | 100 | (/usr/local/texlive/2010/texmf-dist/tex/latex/xcolor/xcolor.sty 101 | Package: xcolor 2007/01/21 v2.11 LaTeX color extensions (UK) 102 | 103 | (/usr/local/texlive/2010/texmf-dist/tex/latex/latexconfig/color.cfg 104 | File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive 105 | ) 106 | Package xcolor Info: Driver file: dvips.def on input line 225. 107 | 108 | (/usr/local/texlive/2010/texmf-dist/tex/latex/graphics/dvips.def 109 | File: dvips.def 1999/02/16 v3.0i Driver-dependant file (DPC,SPQR) 110 | ) 111 | Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1337. 112 | Package xcolor Info: Model `RGB' extended on input line 1353. 113 | Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1355. 114 | Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1356. 115 | Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1357. 116 | Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1358. 117 | Package xcolor Info: Model `Gray' substituted by `gray' on input line 1359. 118 | Package xcolor Info: Model `wave' substituted by `hsb' on input line 1360. 119 | )) 120 | (/usr/local/texlive/2010/texmf-dist/tex/latex/pst-sigsys/pst-sigsys.sty 121 | Package: pst-sigsys 2010/06/18 package wrapper for pst-sigsys.tex (fd) 122 | 123 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pst-sigsys/pst-sigsys.tex 124 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pst-node/pst-node.tex 125 | v1.13, 2010/06/06 126 | \psrow=\count109 127 | \pscol=\count110 128 | \psmatrixcnt=\count111 129 | \psrowsep=\skip43 130 | \pscolsep=\skip44 131 | \pst@args=\count112 132 | \num@pts=\count113 133 | \pst@argcnt=\count114 134 | ) `PST-SigSys' v1.3, 2010/06/18 (fd) 135 | \ss@ticklength=\dimen123 136 | \ss@signalsep=\dimen124 137 | \ss@zerowidth=\dimen125 138 | \ss@zeroradius=\dimen126 139 | \ss@zeroradiusinc=\dimen127 140 | \ss@polewidth=\dimen128 141 | \ss@polelength=\dimen129 142 | \ss@oplength=\dimen130 143 | \ss@opwidth=\dimen131 144 | \ss@opsep=\dimen132 145 | \ss@ldotssep=\dimen133 146 | \ss@ldotssize=\dimen134 147 | \ss@aoffset=\dimen135 148 | \ss@knoblength=\dimen136 149 | \ss@knobwidth=\dimen137 150 | \ss@temp@dimA=\dimen138 151 | \ss@temp@dimB=\dimen139 152 | \ss@temp@dimC=\dimen140 153 | \ss@temp@cnt=\count115 154 | \ss@calc@dim=\dimen141 155 | ) 156 | File: pst-sigsys.tex 2010/06/18 v1.3 `PST-sigsys' (fd) 157 | ) (./Ma-Type1-Figure.aux (./MA-Type1-z-trans.aux)) 158 | \openout1 = `Ma-Type1-Figure.aux'. 159 | 160 | LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4. 161 | LaTeX Font Info: ... okay on input line 4. 162 | LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4. 163 | LaTeX Font Info: ... okay on input line 4. 164 | LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4. 165 | LaTeX Font Info: ... okay on input line 4. 166 | LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4. 167 | LaTeX Font Info: ... okay on input line 4. 168 | LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4. 169 | LaTeX Font Info: ... okay on input line 4. 170 | LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4. 171 | LaTeX Font Info: ... okay on input line 4. 172 | \openout2 = `MA-Type1.aux'. 173 | 174 | (./MA-Type1.tex 175 | LaTeX Font Info: External font `cmex10' loaded for size 176 | (Font) <7> on input line 4. 177 | LaTeX Font Info: External font `cmex10' loaded for size 178 | (Font) <5> on input line 4. 179 | ) [1 180 | 181 | 182 | ] (./Ma-Type1-Figure.aux 183 | (./MA-Type1.aux)) ) 184 | Here is how much of TeX's memory you used: 185 | 2956 strings out of 493748 186 | 38661 string characters out of 3143569 187 | 119022 words of memory out of 3000000 188 | 6273 multiletter control sequences out of 15000+200000 189 | 3640 words of font info for 14 fonts, out of 3000000 for 9000 190 | 714 hyphenation exceptions out of 8191 191 | 39i,5n,55p,576b,366s stack positions out of 5000i,500n,10000p,200000b,50000s 192 | 193 | Output written on Ma-Type1-Figure.dvi (1 page, 10620 bytes). 194 | -------------------------------------------------------------------------------- /submit/Intro-Moving-Avg/Ma-Type1-ztrans-Figure.log: -------------------------------------------------------------------------------- 1 | This is pdfTeX, Version 3.1415926-1.40.11 (TeX Live 2010) (format=latex 2011.6.30) 7 APR 2012 22:01 2 | entering extended mode 3 | restricted \write18 enabled. 4 | %&-line parsing enabled. 5 | **\input Ma-Type1-ztrans-Figure.tex 6 | (./Ma-Type1-ztrans-Figure.tex 7 | (/usr/local/texlive/2010/texmf-dist/tex/latex/base/article.cls 8 | Document Class: article 2007/10/19 v1.4h Standard LaTeX document class 9 | (/usr/local/texlive/2010/texmf-dist/tex/latex/base/size10.clo 10 | File: size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option) 11 | ) 12 | \c@part=\count79 13 | \c@section=\count80 14 | \c@subsection=\count81 15 | \c@subsubsection=\count82 16 | \c@paragraph=\count83 17 | \c@subparagraph=\count84 18 | \c@figure=\count85 19 | \c@table=\count86 20 | \abovecaptionskip=\skip41 21 | \belowcaptionskip=\skip42 22 | \bibindent=\dimen102 23 | ) 24 | (/usr/local/texlive/2010/texmf-dist/tex/latex/pstricks/pstricks.sty 25 | Package: pstricks 2010/06/17 v0.45 LaTeX wrapper for `PSTricks' (RN,HV) 26 | 27 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pstricks/pstricks.tex 28 | (/usr/local/texlive/2010/texmf-dist/tex/generic/xkeyval/pst-xkey.tex 29 | File: pst-xkey.tex 2005/11/25 v1.6 PSTricks specialization of xkeyval (HA) 30 | 31 | (/usr/local/texlive/2010/texmf-dist/tex/latex/xkeyval/xkeyval.sty 32 | Package: xkeyval 2008/08/13 v2.6a package option processing (HA) 33 | 34 | (/usr/local/texlive/2010/texmf-dist/tex/generic/xkeyval/xkeyval.tex 35 | \XKV@toks=\toks14 36 | \XKV@tempa@toks=\toks15 37 | \XKV@depth=\count87 38 | File: xkeyval.tex 2008/08/13 v2.6a key=value parser (HA) 39 | 40 | (/usr/local/texlive/2010/texmf-dist/tex/generic/xkeyval/keyval.tex)))) 41 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pstricks/pst-fp.tex 42 | `pst-fp' v0.06, 2010/05/14 (hv) 43 | \pstFP@xs=\count88 44 | \pstFP@xia=\count89 45 | \pstFP@xib=\count90 46 | \pstFP@xfa=\count91 47 | \pstFP@xfb=\count92 48 | \pstFP@rega=\count93 49 | \pstFP@regb=\count94 50 | \pstFP@regs=\count95 51 | \pstFP@times=\count96 52 | ) 53 | \psLoopIndex=\count97 54 | 55 | `PSTricks' v2.08 <2010/06/06> (tvz) 56 | \pst@dima=\dimen103 57 | \pst@dimb=\dimen104 58 | \pst@dimc=\dimen105 59 | \pst@dimd=\dimen106 60 | \pst@dimg=\dimen107 61 | \pst@dimh=\dimen108 62 | \pst@dimm=\dimen109 63 | \pst@dimn=\dimen110 64 | \pst@dimo=\dimen111 65 | \pst@dimp=\dimen112 66 | \pst@hbox=\box26 67 | \pst@boxg=\box27 68 | \pst@cnta=\count98 69 | \pst@cntb=\count99 70 | \pst@cntc=\count100 71 | \pst@cntd=\count101 72 | \pst@cntg=\count102 73 | \pst@cnth=\count103 74 | \pst@cntm=\count104 75 | \pst@cntn=\count105 76 | \pst@cnto=\count106 77 | \pst@cntp=\count107 78 | \@zero=\count108 79 | \pst@toks=\toks16 80 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pstricks/pstricks.con) 81 | \psunit=\dimen113 82 | \psxunit=\dimen114 83 | \psyunit=\dimen115 84 | \pslinewidth=\dimen116 85 | \pst@customdefs=\toks17 86 | \pslinearc=\dimen117 87 | \pst@symbolStep=\dimen118 88 | \pst@symbolWidth=\dimen119 89 | \everypsbox=\toks18 90 | \psframesep=\dimen120 91 | \pslabelsep=\dimen121 92 | \pst@shift=\dimen122 93 | \theoverlaybox=\box28 94 | ) 95 | File: pstricks.tex 2010/06/06 v2.08 `PSTricks' (tvz,hv) 96 | 97 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pstricks/pst-fp.tex) 98 | File: pst-fp.tex 2010/06/06 v2.08 `PST-fp' (hv) 99 | 100 | (/usr/local/texlive/2010/texmf-dist/tex/latex/xcolor/xcolor.sty 101 | Package: xcolor 2007/01/21 v2.11 LaTeX color extensions (UK) 102 | 103 | (/usr/local/texlive/2010/texmf-dist/tex/latex/latexconfig/color.cfg 104 | File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive 105 | ) 106 | Package xcolor Info: Driver file: dvips.def on input line 225. 107 | 108 | (/usr/local/texlive/2010/texmf-dist/tex/latex/graphics/dvips.def 109 | File: dvips.def 1999/02/16 v3.0i Driver-dependant file (DPC,SPQR) 110 | ) 111 | Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1337. 112 | Package xcolor Info: Model `RGB' extended on input line 1353. 113 | Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1355. 114 | Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1356. 115 | Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1357. 116 | Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1358. 117 | Package xcolor Info: Model `Gray' substituted by `gray' on input line 1359. 118 | Package xcolor Info: Model `wave' substituted by `hsb' on input line 1360. 119 | )) 120 | (/usr/local/texlive/2010/texmf-dist/tex/latex/pst-sigsys/pst-sigsys.sty 121 | Package: pst-sigsys 2010/06/18 package wrapper for pst-sigsys.tex (fd) 122 | 123 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pst-sigsys/pst-sigsys.tex 124 | (/usr/local/texlive/2010/texmf-dist/tex/generic/pst-node/pst-node.tex 125 | v1.13, 2010/06/06 126 | \psrow=\count109 127 | \pscol=\count110 128 | \psmatrixcnt=\count111 129 | \psrowsep=\skip43 130 | \pscolsep=\skip44 131 | \pst@args=\count112 132 | \num@pts=\count113 133 | \pst@argcnt=\count114 134 | ) `PST-SigSys' v1.3, 2010/06/18 (fd) 135 | \ss@ticklength=\dimen123 136 | \ss@signalsep=\dimen124 137 | \ss@zerowidth=\dimen125 138 | \ss@zeroradius=\dimen126 139 | \ss@zeroradiusinc=\dimen127 140 | \ss@polewidth=\dimen128 141 | \ss@polelength=\dimen129 142 | \ss@oplength=\dimen130 143 | \ss@opwidth=\dimen131 144 | \ss@opsep=\dimen132 145 | \ss@ldotssep=\dimen133 146 | \ss@ldotssize=\dimen134 147 | \ss@aoffset=\dimen135 148 | \ss@knoblength=\dimen136 149 | \ss@knobwidth=\dimen137 150 | \ss@temp@dimA=\dimen138 151 | \ss@temp@dimB=\dimen139 152 | \ss@temp@dimC=\dimen140 153 | \ss@temp@cnt=\count115 154 | \ss@calc@dim=\dimen141 155 | ) 156 | File: pst-sigsys.tex 2010/06/18 v1.3 `PST-sigsys' (fd) 157 | ) 158 | No file Ma-Type1-ztrans-Figure.aux. 159 | \openout1 = `Ma-Type1-ztrans-Figure.aux'. 160 | 161 | LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4. 162 | LaTeX Font Info: ... okay on input line 4. 163 | LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4. 164 | LaTeX Font Info: ... okay on input line 4. 165 | LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4. 166 | LaTeX Font Info: ... okay on input line 4. 167 | LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4. 168 | LaTeX Font Info: ... okay on input line 4. 169 | LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4. 170 | LaTeX Font Info: ... okay on input line 4. 171 | LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4. 172 | LaTeX Font Info: ... okay on input line 4. 173 | \openout2 = `MA-Type1-z-trans.aux'. 174 | 175 | (./MA-Type1-z-trans.tex 176 | LaTeX Font Info: External font `cmex10' loaded for size 177 | (Font) <7> on input line 5. 178 | LaTeX Font Info: External font `cmex10' loaded for size 179 | (Font) <5> on input line 5. 180 | ) [1 181 | 182 | 183 | ] (./Ma-Type1-ztrans-Figure.aux 184 | (./MA-Type1-z-trans.aux)) ) 185 | Here is how much of TeX's memory you used: 186 | 2950 strings out of 493748 187 | 38633 string characters out of 3143569 188 | 118022 words of memory out of 3000000 189 | 6272 multiletter control sequences out of 15000+200000 190 | 3640 words of font info for 14 fonts, out of 3000000 for 9000 191 | 714 hyphenation exceptions out of 8191 192 | 40i,5n,59p,583b,317s stack positions out of 5000i,500n,10000p,200000b,50000s 193 | 194 | Output written on Ma-Type1-ztrans-Figure.dvi (1 page, 2548 bytes). 195 | -------------------------------------------------------------------------------- /source/article2.md: -------------------------------------------------------------------------------- 1 | ## C 語言秘技 (1) – 使用 sscanf 模仿正規表達式的剖析功能 (作者:陳鍾誠) 2 | 3 | 在本系列文章中,我們將會陸續介紹一些 C 語言當中比較不常見,但是卻很強大的用法,希望透過這一系列的文章,能讓讀者感受到 C 語言的威力。 4 | 5 | ### 前言 6 | 7 | 從 1972 年 Dennis Ritchie 在貝爾實驗室發明 C 語言至今,已經過了將近四十個年頭。在這個變化快速的電腦世界裡,C 語言彷彿成了不變的避風港。四十年來,C 語言的改變並不多,而且一直都是所有作業系統底層的主力語言。近來,由於 Linux 與開放原始碼的發展,C 語言的影響力更為增強。在這裡,我不禁要問一個問題,為何 C 語言可以經過四十年而幾乎毫不改變。 8 | 9 | C 語言很快,這或許是原因之ㄧ,但是像 Pascal 或 Fortran 等語言也幾乎與 C 語言一樣快,那又為何非 C 語言不可。但是,C 語言不只是快,還具有指標,容易與組合語言連結,具有巨集、條件式編譯、inline 函數、結構化、可以使用記憶體映射輸出入,因此可以用高階語言撰寫低階輸出入驅動程式,還有撰寫作業系統。 10 | 11 | 這些特性,讓 C 語言特別適合撰寫嵌入式系統,而嵌入式系統的環境,基本上也就是讓電腦退化到幾十年前的狀態,很小的記憶體、很慢的 CPU、通常沒有硬碟等等。今日的嵌入式系統,有點神似當年 Dennis Ritchie 所面對的環境,在很克難的資源中,發展出強大的作業系統。 12 | 13 | UNIX 正是催生 C 語言的主要動力,當年 Ken Thompson 與 Dennis Ritchie 正是為了發展 UNIX 而設計出 C 語言的,這兩人也因為 UNIX/C 的貢獻而被 ACM 授予 Turing Award 這的電腦界的諾貝爾獎。 14 | 15 | 在 1978 年,Dennis 與另一位共同作者 Brian Wilson Kernighan 合力撰寫了第一本廣為流傳的 C 語言教科書,而這個版本的教科書由於影響深遠,成為人手一冊的 C 語言經典,因此後來我們這個版本的 C 語言教科書簡稱為 K&R 版本, 16 | 這個經典書籍中所使用的 C 語言版本也因此而被稱為 K&R 版的 C 語言,以便與後來 1988 年的 ANSI C 版本,以及 1999 年的 ISO C99 版本有所區隔。 (一個很容易誤會的點是, Ken Thompson 與 Brian Wilson Kernighan 是不同的兩個人,Ken Thompson 是發明 UNIX 與 C 語言的那個 Turing Award 得獎者,但是 Brian Wilson Kernighan 則是 C 語言書籍的作者,這兩個人的名字雖然都以 K 開頭,但是此 K 非比 K,請讀者切勿混淆)。 17 | 18 | 因此,學習 C 語言的人,如果只是將 C 當作是一般的程式語言,就會難以體會 C 語言的威力之所在,我們必須進入嵌入式與作業系統的領域,才能體會 C 語言的優點。一但您能夠體會這些優點,C 語言將不再僅僅是一個普通的語言,您也將能體會為何 C 語言會經歷四十年而不墬。然後,您也才能發揮 C 語言的能力,並且體會這些設計背後的優點與缺點。 19 | 20 | ### C 語言的優缺點 21 | 22 | C 語言並非沒有缺點的,實際上,C 語言的缺點非常的多,多到可以用罄竹難書來形容。舉例而言,用 C 語言寫程式很容易有 bug,特別是在記憶體分配與回收這部份更是如此。C 語言沒有自動記憶体回收機制,沒有垃圾收集功能,因此常常導致忘記釋放記憶體,或者將同一個記憶體釋放數次,因而造成錯誤。C 語言的字串很原始,使用起來非常不方便。C 語言的標準函式庫甚至沒有基本的資料結構,像是陣列、串列、堆疊、字典等相關結構的函式庫。C 語言的條件式編譯讓程式看起來很冗長,使用標頭檔 *.h 讓你必需重複撰寫函數表頭,浪費許多時間。更糟的是,由於 C 語言的標準函式庫很小,因此在不同的平台上,每個廠商都實作出完全不同的函式庫,這導致 C 語言的程式難以跨越平台執行,您必須位每個平台打造一份程式,而不像 Java 那樣可以 Write Once,Run Anywhere。 23 | 24 | 但是,即便有了這麼多的缺點,C 語言仍然歷經四十年而不衰,這又是為甚麼呢? 25 | 26 | 每個 C 語言的缺點,幾乎都是伴隨著其優點而來的,C 語言的記憶體難以管理,是因為 C 語言具有強大的指標功能。字串函數很原始,是為了讓您可以使用字元陣列的方式處理字串,而不需要使用動態記憶體配置。無法跨越平台,是因為 C 語言適合用來打造底層的嵌入式系統,可以直接連結組合語言協同工作。從這個角度看來,C 語言的設計其實是相當精巧的,這也是 C 語言為何經歷四十年而不衰的原因。 27 | 28 | ### 學習 C 語言的好處 29 | 30 | C 語言幾乎是當今被廣泛使用的語言當中,唯一同時具有高階與低階特性的語言,這個特性主要是由指標所造成的。利用指標,您可以用記憶體映射的方法存取記憶體,這讓 C 語言可以直接與周邊裝置溝通,因此許多裝置驅動程式可以用 C 語言撰寫,而不需要全部用組合語言。 31 | 32 | 學習 C 語言的投資報酬率,必須以數十年甚至一輩子的眼光來看,而不是短視的。程式語言多如過江之鯽,每隔兩三年就必須學習全新的語言,就像流行音樂或服飾一般,學會之後很快就會膩了。C 語言絕對不是流行的語言,而是一種經典的、長久的、耐用的語言,您在 C 語言的投資不會浪費,因為 C 語言將會陪伴您,走過數十年,甚至是一輩子。 33 | 34 | ### 密技 1 :用 sscanf 剖析文字串 35 | 36 | C 語言中的 scanf 函數,是初學者都會使用的,但也是大部分人都會誤用,或者是無法充分發揮其功能的。 37 | 38 | C 語言的 sscanf() 與 ssprintf() 這兩個函數,採用的是一種既創新又好用的設計法, 39 | 40 | 事實上,函數 sscanf() 比 scanf() 更為好用,sscanf() 甚至支援了類似 Regular Expression 的功能,可以讓我們輕易的剖析格式化的字串。 41 | 42 | sscanf 的函數原形如下,其中的 format 格式字串具有複雜的格式指定功能,以下我們將詳細說明這些格式的用途。 43 | 44 | ```CPP 45 | int sscanf ( const char * str, const char * format, ...); 46 | 47 | str : 被剖析的字串 48 | format: 剖析格式 49 | 50 | 在 format 字串中,以 % 起頭者為剖析段落,通常在剖析完成後會指定給後面的變數,其格式語法如下: 51 | 52 | 剖析段落的語法:%[*][width][modifiers]type 53 | 54 | % 代表變數開始 55 | 56 | * 代表省略不放入變數中 57 | 58 | width 代表最大讀取寬度 59 | 60 | modifier 可以是 {h|I|L} 之一 61 | 說明 : 其中 h 代表 2 byte 的變數 (像 short int), 62 | l 代表 4 byte 的變數 (像 long int), 63 | L 代表 8 byte 的變數 (像 long double) 64 | 65 | type 則可以是 c, d,e,E,f,g,G,o, s, u, x, X 等基本型態, 66 | 也可以是類似 Regular Expression 的表達式。 67 | 說明: c : 字元 (char); 68 | d : 整數 (Decimal integer); 69 | f : 浮點數 (Floating Point); 70 | e,E : 科學記號 (Scientific notation); 71 | g,G : 取浮點數或科學記號當中短的那個; 72 | o : 八進位 (Octal Integer); 73 | u : 無號數 (unsigned integer); 74 | x, X : 十六進位 (Hexadecimal integer) 75 | ``` 76 | 77 | 為了說明 sscanf 函數的用法,我們寫了以下程式,以示範 format 欄位的各種寫法。 78 | 79 | 檔案:sscanf.c 80 | 81 | ```CPP 82 | #include 83 | 84 | int main() { 85 | char name[20], tel[50], field[20], areaCode[20], code[20]; 86 | int age; 87 | sscanf("name:john age:40 tel:082-313530", "%s", name); 88 | printf("%s\n", name); 89 | sscanf("name:john age:40 tel:082-313530", "%8s", name); 90 | printf("%s\n", name); 91 | sscanf("name:john age:40 tel:082-313530", "%[^:]", name); 92 | printf("%s\n", name); 93 | sscanf("name:john age:40 tel:082-313530", "%[^:]:%s", field, name); 94 | printf("%s %s\n", field, name); 95 | sscanf("name:john age:40 tel:082-313530", "name:%s age:%d tel:%s", name, &age, tel); 96 | printf("%s %d %s\n", name, age, tel); 97 | sscanf("name:john age:40 tel:082-313530", "%*[^:]:%s %*[^:]:%d %*[^:]:%s", name, &age, tel); 98 | printf("%s %d %s\n", name, age, tel); 99 | 100 | char protocol[10], site[50], path[50]; 101 | sscanf("http://ccckmit.wikidot.com/cp/list/hello.txt", 102 | "%[^:]:%*2[/]%[^/]/%[a-zA-Z0-9._/-]", 103 | protocol, site, path); 104 | printf("protocol=%s site=%s path=%s\n", protocol, site, path); 105 | return 1; 106 | } 107 | ``` 108 | 109 | 其編譯執行結果如下所示。 110 | 111 | ``` 112 | D:\oc>gcc sscanf.c -o sscanf 113 | 114 | D:\oc>sscanf 115 | name:john 116 | name:joh 117 | name 118 | name john 119 | john 40 082-313530 120 | john 40 082-313530 121 | protocol=http site=ccckmit.wikidot.com path=cp/list/hello.txt 122 | ``` 123 | 124 | ### 程式碼解析 125 | 126 | 您應該可以看到,在上述程式碼當中,所有的 %s, %d 等輸入欄位,預設都是以空白做為結尾的,例如以下指令就只會掃描到 127 | `name="name:john"`,因為後面是空白了,所以就把 %s 的內容丟到了變數 name 當中。 128 | 129 | ```CPP 130 | sscanf("name:john age:40 tel:082-313530", "%s", name); 131 | printf("%s\n", name); 132 | ``` 133 | 134 | 如果我們在 %s 等樣式中指定長度,像是以下這個 sscanf 所採用的 %8s,那麼掃描到 8 個字元之後就會停止了,所以此時 135 | `name="name:joh"` 。 136 | 137 | ```CPP 138 | sscanf("name:john age:40 tel:082-313530", "%8s", name); 139 | printf("%s\n", name); 140 | ``` 141 | 142 | 但是我們可以透過類似正規表達式的語法,來設定掃描的方式,舉例而言,像是以下的 sscanf 所採用的 `%[^:]` ,就讓我們 143 | 可以掃描到 `:` 符號為止,其中的樣式 `[^abc]` 符號代表不要比對 a, b, c 這些字元,所以 `[^:]` 代表的是不可比對到 144 | `:` 這個符號,因此就會在比對到該符號時停止了。於是掃描的結果會是 `name="name"` 。 145 | 146 | ```CPP 147 | sscanf("name:john age:40 tel:082-313530", "%[^:]", name); 148 | printf("%s\n", name); 149 | ``` 150 | 151 | 當然、這些 %s, %d 等樣式之間還可以串接,以便進行連續掃描,因此下面這個 sscanf 指令可以一次掃出 field 與 name 兩個欄位, 152 | 結果會是 field="name", name="john" 。 153 | 154 | ```CPP 155 | sscanf("name:john age:40 tel:082-313530", "%[^:]:%s", field, name); 156 | printf("%s %s\n", field, name); 157 | ``` 158 | 159 | 而且、在掃描到整數或浮點等非字串欄位時,還會將掃描到的結果轉為該型態放入變數中,例如下列 sscanf 指令中的 `&age` 欄位, 160 | 就會直接得到整數值,不需要像一般正規表達式那樣還需要經過轉型才能使用。 161 | 162 | ```CPP 163 | sscanf("name:john age:40 tel:082-313530", "name:%s age:%d tel:%s", name, &age, tel); 164 | printf("%s %d %s\n", name, age, tel); 165 | ``` 166 | 167 | 如果我們希望某些欄位在掃描後,直接丟棄而不要存入任何變數中,那麼就可以用 `%*...` 這種加上 `*` 號的格式,此時 sscanf 會知道要將該欄位丟棄,不要存入到後面的變數裏。 168 | 169 | ```CPP 170 | sscanf("name:john age:40 tel:082-313530", "%*[^:]:%s %*[^:]:%d %*[^:]:%s", name, &age, tel); 171 | printf("%s %d %s\n", name, age, tel); 172 | ``` 173 | 174 | 甚至、我們可以真的把 sscanf 當成「正規表達式」使用,只是語法稍有差異,功能也不像正規表達式那麼強,不過通常也夠用了。 175 | 176 | 舉例而言,以下的 sscanf 可以將一個網址剖析成 protocol, site, path 等三個段落,您可以看到我們使用的 `"%[^:]:%*2[/]%[^/]/%[a-zA-Z0-9._/-]"` 這個樣式,看起來是不是真的很像「正規表達式」呢? 177 | 178 | ```CPP 179 | char protocol[10], site[50], path[50]; 180 | sscanf("http://ccckmit.wikidot.com/cp/list/hello.txt", 181 | "%[^:]:%*2[/]%[^/]/%[a-zA-Z0-9._/-]", 182 | protocol, site, path); 183 | printf("protocol=%s site=%s path=%s\n", protocol, site, path); 184 | ``` 185 | 186 | ### 結語 187 | 188 | 對於很多想在 C 語言裏使用正規表達式的朋友來說,很可能沒有想過使用 sscanf 去取代 regex 之類的函式庫,但是經由以上的範例,您應該可以感覺到 sscanf 在某種程度上是可以替代「正規表達式」函式庫的,這樣我們就不需要引入 regex 之類的函式庫,除了節省程式碼所佔的空間之外,由於 sscanf 是標準函式庫,因此使用起來會更加容易。 189 | 190 | 況且、sscanf 可以直接將 %d %f 之類的參數放入整數與浮點數型態的變數當中,這樣還可以省下一道轉換的動作,因此、只要能夠用 sscanf 替代的功能,筆者通常不會引入正規表達式的函式庫,因為對筆者而言,在 C 當中使用 sscanf 比正規表達式更順手啊! 191 | 192 | ### 參考文獻 193 | * 194 | * 195 | 196 | -------------------------------------------------------------------------------- /htm/article4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 28 | 29 | 30 | 31 |
32 |

程式人雜誌 -- 2013 年 12 月號 (開放公益出版品)

33 |
34 |
35 | 40 |

[Visual Basic 6.0] 利用 堆疊(Stack) 實作中序轉前序與後序 (作者:廖憲得 0xde)

41 |
42 | 43 |
44 |
45 | 46 |
47 |
48 | 49 |
50 |
51 | 52 |
53 |
54 | 55 |
56 |
57 | 58 |
59 |
Dim Stack() ' 建立一個堆疊
 60 | Dim StackTop ' 堆疊頂端指標
 61 | 
 62 | Private Sub StartInFo_Click()
 63 | '-----中序轉後序-----
 64 | ReDim Stack(Len(Text1)) ' 堆疊大小為整串大小 (避免出錯)
 65 | StackTop = 0 ' 堆疊初始化
 66 | Text3 = "" ' 一開始將輸出清空
 67 | 
 68 | For i = 1 To Len(Text1) ' 一個一個字抓直到結束
 69 |     Select Case Mid(Text1, i, 1)
 70 |         Case "(" ' 放入堆疊中
 71 |             StackPush (Mid(Text1, i, 1))
 72 |         Case ")"
 73 |             ' 拿出來直到等於 "("
 74 |             Do Until Stack(StackTop) = "("
 75 |                 Text3 = Text3 & StackPop
 76 |             Loop
 77 |                 StackPop
 78 |         Case "+", "-" ' 如果堆疊頂端的權值大於等於讀入的值則先讀出 => "+","-","*","/"
 79 |             Do Until Stack(StackTop) <> "+" And Stack(StackTop) <> "-" And Stack(StackTop) <> "/" And Stack(StackTop) <> "*"
 80 |                 Text3 = Text3 & StackPop
 81 |             Loop
 82 |             StackPush (Mid(Text1, i, 1))
 83 |         Case "*", "/" ' 如果堆疊頂端的權值大於等於讀入的值則先讀出 => "*","/"
 84 |             Do Until Stack(StackTop) <> "*" And Stack(StackTop) <> "/"
 85 |                 Text3 = Text3 & StackPop
 86 |             Loop
 87 |             StackPush (Mid(Text1, i, 1))
 88 |         Case Else ' 除了括號或運算元直接放入
 89 |             Text3 = Text3 & Mid(Text1, i, 1)
 90 |     End Select
 91 | Next i
 92 | 
 93 | Do Until StackTop = 0 ' 將堆疊中的全部拿出來
 94 |     Text3 = Text3 & StackPop
 95 | Loop
 96 | 
 97 | 
 98 | '-----中序轉前序-----
 99 | ReDim Stack(Len(Text1)) ' 堆疊大小為整串大小 (避免出錯)
100 | StackTop = 0 ' 堆疊初始化
101 | Text2 = "" ' 一開始將輸出清空
102 | 
103 | For i = Len(Text1) To 1 Step -1 ' 從最後面開始做做到最前面,輸出也是從後面放到前面
104 |     Select Case Mid(Text1, i, 1)
105 |         Case ")" ' 放入堆疊中
106 |             StackPush (Mid(Text1, i, 1))
107 |         Case "(" ' 拿出來直到等於 ")"
108 |             Do Until Stack(StackTop) = ")"
109 |                 Text2 = StackPop & Text2
110 |             Loop
111 |                 StackPop
112 |         Case "+", "-" ' 拿到直接讀入的值 <= 堆疊頂端的值
113 |             Do Until Stack(StackTop) <> "*" And Stack(StackTop) <> "/"
114 |                 Text2 = StackPop & Text2
115 |             Loop
116 |             StackPush (Mid(Text1, i, 1))
117 |         Case "*", "/"
118 |             StackPush (Mid(Text1, i, 1)) ' 直接放入
119 |         Case Else ' 除了括號或運算元直接放入
120 |             Text2 = Mid(Text1, i, 1) & Text2
121 |     End Select
122 | Next i
123 | 
124 | Do Until StackTop = 0 ' 將堆疊中的全部拿出來
125 |     Text2 = StackPop & Text2
126 | Loop
127 | End Sub
128 | 
129 | Function StackPush(Inp) ' 放入堆疊
130 |     StackTop = StackTop + 1
131 |     Stack(StackTop) = Inp
132 | End Function
133 | 
134 | Function StackPop() ' 從堆疊中讀出
135 |     StackPop = Stack(StackTop)
136 |     Stack(StackTop) = ""
137 |     StackTop = StackTop - 1
138 | End Function
139 | 142 |

【本文作者為「廖憲得」,原文網址為: http://www.dotblogs.com.tw/0xde/archive/2013/11/18/130093.aspx ,由陳鍾誠編輯後納入本雜誌】

143 |
144 | 147 | 148 | 149 | --------------------------------------------------------------------------------