├── book
├── pmag201303.html
├── pmag201303A4.epub
├── pmag201303A4.pdf
├── pmag201303ipad.epub
└── pmag201303ipad.pdf
├── code.zip
├── code
├── Deadlock
│ ├── Deadlock.sln
│ ├── Deadlock.suo
│ └── Deadlock
│ │ ├── Deadlock.csproj
│ │ ├── Deadlock.csproj.user
│ │ ├── Properties
│ │ └── AssemblyInfo.cs
│ │ ├── ThreadTest.cs
│ │ ├── bin
│ │ ├── Debug
│ │ │ ├── ConsoleApplication1.exe
│ │ │ ├── ConsoleApplication1.pdb
│ │ │ ├── ConsoleApplication1.vshost.exe
│ │ │ ├── Deadlock.exe
│ │ │ ├── Deadlock.pdb
│ │ │ └── Deadlock.vshost.exe
│ │ └── Release
│ │ │ ├── ConsoleApplication1.exe
│ │ │ └── ConsoleApplication1.pdb
│ │ └── obj
│ │ └── x86
│ │ ├── Debug
│ │ ├── ConsoleApplication1.csproj.FileListAbsolute.txt
│ │ ├── ConsoleApplication1.exe
│ │ ├── ConsoleApplication1.pdb
│ │ ├── Deadlock.csproj.FileListAbsolute.txt
│ │ ├── Deadlock.exe
│ │ ├── Deadlock.pdb
│ │ └── DesignTimeResolveAssemblyReferencesInput.cache
│ │ └── Release
│ │ ├── ConsoleApplication1.csproj.FileListAbsolute.txt
│ │ ├── ConsoleApplication1.exe
│ │ ├── ConsoleApplication1.pdb
│ │ └── DesignTimeResolveAssemblyReferencesInput.cache
├── ThreadTest
│ ├── ThreadTest.sln
│ ├── ThreadTest.suo
│ └── ThreadTest
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── AssemblyInfo.cs
│ │ ├── ThreadTest.csproj
│ │ ├── ThreadTest.csproj.user
│ │ ├── bin
│ │ └── Debug
│ │ │ ├── ConsoleApplication1.vshost.exe
│ │ │ ├── ConsoleApplication1.vshost.exe.manifest
│ │ │ ├── ThreadTest.exe
│ │ │ ├── ThreadTest.pdb
│ │ │ └── ThreadTest.vshost.exe
│ │ └── obj
│ │ └── x86
│ │ └── Debug
│ │ ├── DesignTimeResolveAssemblyReferencesInput.cache
│ │ ├── ThreadTest.csproj.FileListAbsolute.txt
│ │ ├── ThreadTest.exe
│ │ └── ThreadTest.pdb
└── closure.htm
├── css
└── PMAG.CSS
├── htm
├── article1.html
├── article2.html
├── article3.html
├── article4.html
├── home.html
├── info.html
├── license.html
├── message1.html
├── message2.html
├── message3.html
├── message4.html
├── people1.html
├── people2.html
└── video1.html
├── img
├── 640px-Rms_at_pitt.jpg
├── CSharpDeadlockRun1.jpg
├── CSharpThreadRun1.jpg
├── CSharpThreadRun2.jpg
├── Deadlock.jpg
├── FileMultithreadedProcess.jpg
├── FreeComputerBooks_page.jpg
├── Htop.png
├── MIT_MOOC_exam.jpg
├── MIT_MOOC_grade.jpg
├── MIT_MOOC_page.jpg
├── ProcessScreenshot.jpg
├── ProcessVsThread.jpg
├── R_download_page.jpg
├── R_help.jpg
├── R_run.jpg
├── RetargetableCompiler.png
├── arduino_led2_board1.png
├── arduino_led2_chip1.png
├── arduino_led_board1.png
├── arduino_led_chip1.png
├── cc_matrix.jpg
├── pmag_cover.jpg
├── pmag_cover_A4.png
└── table_css_embed.jpg
├── source
├── HEADER.HTM
├── Makefile
├── article.md
├── article1.md
├── article2.md
├── article3.md
├── article4.md
├── build.bat
├── footer.htm
├── head.md
├── home.md
├── info.md
├── license.md
├── message.md
├── message1.md
├── message2.md
├── message3.md
├── message4.md
├── metadata.xml
├── pdffooter.htm
├── people.md
├── people1.md
├── people2.md
├── reflink.md
├── toc.md
├── video.md
└── video1.md
├── template.zip
└── template
├── build.bat
├── footer.htm
├── header.htm
├── pmag.css
├── sample.png
├── submit.md
├── template.htm
├── template.md
└── template.odt
/book/pmag201303A4.epub:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/book/pmag201303A4.epub
--------------------------------------------------------------------------------
/book/pmag201303A4.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/book/pmag201303A4.pdf
--------------------------------------------------------------------------------
/book/pmag201303ipad.epub:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/book/pmag201303ipad.epub
--------------------------------------------------------------------------------
/book/pmag201303ipad.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/book/pmag201303ipad.pdf
--------------------------------------------------------------------------------
/code.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code.zip
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 11.00
3 | # Visual C# Express 2010
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Deadlock", "Deadlock\Deadlock.csproj", "{CDE86142-2382-4A6F-BEA0-63C59B7F73BB}"
5 | EndProject
6 | Global
7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
8 | Debug|x86 = Debug|x86
9 | Release|x86 = Release|x86
10 | EndGlobalSection
11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
12 | {CDE86142-2382-4A6F-BEA0-63C59B7F73BB}.Debug|x86.ActiveCfg = Debug|x86
13 | {CDE86142-2382-4A6F-BEA0-63C59B7F73BB}.Debug|x86.Build.0 = Debug|x86
14 | {CDE86142-2382-4A6F-BEA0-63C59B7F73BB}.Release|x86.ActiveCfg = Release|x86
15 | {CDE86142-2382-4A6F-BEA0-63C59B7F73BB}.Release|x86.Build.0 = Release|x86
16 | EndGlobalSection
17 | GlobalSection(SolutionProperties) = preSolution
18 | HideSolutionNode = FALSE
19 | EndGlobalSection
20 | EndGlobal
21 |
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock.suo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock.suo
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/Deadlock.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | x86
6 | 8.0.30703
7 | 2.0
8 | {CDE86142-2382-4A6F-BEA0-63C59B7F73BB}
9 | Exe
10 | Properties
11 | ConsoleApplication1
12 | Deadlock
13 | v4.0
14 | Client
15 | 512
16 |
17 |
18 | x86
19 | true
20 | full
21 | false
22 | bin\Debug\
23 | DEBUG;TRACE
24 | prompt
25 | 4
26 |
27 |
28 | x86
29 | pdbonly
30 | true
31 | bin\Release\
32 | TRACE
33 | prompt
34 | 4
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
57 |
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/Deadlock.csproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("ConsoleApplication1")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("ConsoleApplication1")]
13 | [assembly: AssemblyCopyright("Copyright © 2013")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("1b6c70f6-7e95-4be4-af69-1df14dcbfa86")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/ThreadTest.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading;
3 | using System.Text;
4 |
5 | class ThreadTest
6 | {
7 | static StringBuilder A = new StringBuilder("A");
8 | static StringBuilder B = new StringBuilder("B");
9 |
10 | public static void Main(String[] args)
11 | {
12 | Thread thread1 = new Thread(new ThreadStart(AB));
13 | Thread thread2 = new Thread(new ThreadStart(BA));
14 | thread1.Start();
15 | thread2.Start();
16 | thread1.Join();
17 | thread2.Join();
18 | }
19 |
20 | public static void AB()
21 | {
22 | lock (A)
23 | {
24 | Console.WriteLine("AB.lock(A)");
25 | Thread.Sleep(1000);
26 | lock (B)
27 | {
28 | Console.WriteLine("AB.lock(B)");
29 | }
30 | }
31 | }
32 |
33 | public static void BA()
34 | {
35 | lock (B)
36 | {
37 | Console.WriteLine("BA.lock(B)");
38 | Thread.Sleep(1000);
39 | lock (A)
40 | {
41 | Console.WriteLine("BA.lock(A)");
42 | }
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/bin/Debug/ConsoleApplication1.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/bin/Debug/ConsoleApplication1.exe
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/bin/Debug/ConsoleApplication1.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/bin/Debug/ConsoleApplication1.pdb
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/bin/Debug/ConsoleApplication1.vshost.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/bin/Debug/ConsoleApplication1.vshost.exe
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/bin/Debug/Deadlock.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/bin/Debug/Deadlock.exe
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/bin/Debug/Deadlock.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/bin/Debug/Deadlock.pdb
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/bin/Debug/Deadlock.vshost.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/bin/Debug/Deadlock.vshost.exe
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/bin/Release/ConsoleApplication1.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/bin/Release/ConsoleApplication1.exe
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/bin/Release/ConsoleApplication1.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/bin/Release/ConsoleApplication1.pdb
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Debug/ConsoleApplication1.csproj.FileListAbsolute.txt:
--------------------------------------------------------------------------------
1 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
2 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\bin\Debug\ConsoleApplication1.pdb
3 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\obj\x86\Debug\ResolveAssemblyReference.cache
4 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\obj\x86\Debug\ConsoleApplication1.exe
5 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\obj\x86\Debug\ConsoleApplication1.pdb
6 |
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Debug/ConsoleApplication1.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/obj/x86/Debug/ConsoleApplication1.exe
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Debug/ConsoleApplication1.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/obj/x86/Debug/ConsoleApplication1.pdb
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Debug/Deadlock.csproj.FileListAbsolute.txt:
--------------------------------------------------------------------------------
1 | D:\Dropbox\Public\pmag\201303\code\Deadlock\Deadlock\bin\Debug\Deadlock.exe
2 | D:\Dropbox\Public\pmag\201303\code\Deadlock\Deadlock\bin\Debug\Deadlock.pdb
3 | D:\Dropbox\Public\pmag\201303\code\Deadlock\Deadlock\obj\x86\Debug\ResolveAssemblyReference.cache
4 | D:\Dropbox\Public\pmag\201303\code\Deadlock\Deadlock\obj\x86\Debug\Deadlock.exe
5 | D:\Dropbox\Public\pmag\201303\code\Deadlock\Deadlock\obj\x86\Debug\Deadlock.pdb
6 |
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Debug/Deadlock.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/obj/x86/Debug/Deadlock.exe
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Debug/Deadlock.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/obj/x86/Debug/Deadlock.pdb
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Release/ConsoleApplication1.csproj.FileListAbsolute.txt:
--------------------------------------------------------------------------------
1 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\bin\Release\ConsoleApplication1.exe
2 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\bin\Release\ConsoleApplication1.pdb
3 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\obj\x86\Release\ResolveAssemblyReference.cache
4 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\obj\x86\Release\ConsoleApplication1.exe
5 | C:\Users\ccc\AppData\Local\Temporary Projects\ConsoleApplication1\obj\x86\Release\ConsoleApplication1.pdb
6 |
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Release/ConsoleApplication1.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/obj/x86/Release/ConsoleApplication1.exe
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Release/ConsoleApplication1.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/obj/x86/Release/ConsoleApplication1.pdb
--------------------------------------------------------------------------------
/code/Deadlock/Deadlock/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/Deadlock/Deadlock/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 11.00
3 | # Visual C# Express 2010
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThreadTest", "ThreadTest\ThreadTest.csproj", "{46FD6B29-1F60-4663-8871-135AD5D92461}"
5 | EndProject
6 | Global
7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
8 | Debug|x86 = Debug|x86
9 | Release|x86 = Release|x86
10 | EndGlobalSection
11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
12 | {46FD6B29-1F60-4663-8871-135AD5D92461}.Debug|x86.ActiveCfg = Debug|x86
13 | {46FD6B29-1F60-4663-8871-135AD5D92461}.Debug|x86.Build.0 = Debug|x86
14 | {46FD6B29-1F60-4663-8871-135AD5D92461}.Release|x86.ActiveCfg = Release|x86
15 | {46FD6B29-1F60-4663-8871-135AD5D92461}.Release|x86.Build.0 = Release|x86
16 | EndGlobalSection
17 | GlobalSection(SolutionProperties) = preSolution
18 | HideSolutionNode = FALSE
19 | EndGlobalSection
20 | EndGlobal
21 |
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest.suo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/ThreadTest/ThreadTest.suo
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading;
3 |
4 | class SimpleThread
5 | {
6 | String name;
7 |
8 | public static void Main(String[] args)
9 | {
10 | SimpleThread a = new SimpleThread("A");
11 | SimpleThread b = new SimpleThread("B");
12 | Thread athread = new Thread(new ThreadStart(a.run));
13 | Thread bthread = new Thread(new ThreadStart(b.run));
14 | athread.Start();
15 | bthread.Start();
16 | athread.Join();
17 | bthread.Join();
18 | }
19 |
20 | SimpleThread(String pName)
21 | {
22 | name = pName;
23 | }
24 |
25 | public void run()
26 | {
27 | for (int i = 0; i < 10; i++)
28 | {
29 | String line = name + ":" + i;
30 | Console.WriteLine(line);
31 | // Thread.Sleep(10);
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("ConsoleApplication1")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("ConsoleApplication1")]
13 | [assembly: AssemblyCopyright("Copyright © 2013")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("c0fc0387-e309-4034-a300-4174b5fe1f31")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/ThreadTest.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | x86
6 | 8.0.30703
7 | 2.0
8 | {46FD6B29-1F60-4663-8871-135AD5D92461}
9 | Exe
10 | Properties
11 | ConsoleApplication1
12 | ThreadTest
13 | v4.0
14 | Client
15 | 512
16 |
17 |
18 | x86
19 | true
20 | full
21 | false
22 | bin\Debug\
23 | DEBUG;TRACE
24 | prompt
25 | 4
26 |
27 |
28 | x86
29 | pdbonly
30 | true
31 | bin\Release\
32 | TRACE
33 | prompt
34 | 4
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
57 |
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/ThreadTest.csproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/bin/Debug/ConsoleApplication1.vshost.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/ThreadTest/ThreadTest/bin/Debug/ConsoleApplication1.vshost.exe
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/bin/Debug/ConsoleApplication1.vshost.exe.manifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/bin/Debug/ThreadTest.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/ThreadTest/ThreadTest/bin/Debug/ThreadTest.exe
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/bin/Debug/ThreadTest.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/ThreadTest/ThreadTest/bin/Debug/ThreadTest.pdb
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/bin/Debug/ThreadTest.vshost.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/ThreadTest/ThreadTest/bin/Debug/ThreadTest.vshost.exe
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/ThreadTest/ThreadTest/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/obj/x86/Debug/ThreadTest.csproj.FileListAbsolute.txt:
--------------------------------------------------------------------------------
1 | D:\Dropbox\Public\pmag\201303\code\ThreadTest\ThreadTest\bin\Debug\ThreadTest.exe
2 | D:\Dropbox\Public\pmag\201303\code\ThreadTest\ThreadTest\bin\Debug\ThreadTest.pdb
3 | D:\Dropbox\Public\pmag\201303\code\ThreadTest\ThreadTest\obj\x86\Debug\ResolveAssemblyReference.cache
4 | D:\Dropbox\Public\pmag\201303\code\ThreadTest\ThreadTest\obj\x86\Debug\ThreadTest.exe
5 | D:\Dropbox\Public\pmag\201303\code\ThreadTest\ThreadTest\obj\x86\Debug\ThreadTest.pdb
6 |
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/obj/x86/Debug/ThreadTest.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/ThreadTest/ThreadTest/obj/x86/Debug/ThreadTest.exe
--------------------------------------------------------------------------------
/code/ThreadTest/ThreadTest/obj/x86/Debug/ThreadTest.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/code/ThreadTest/ThreadTest/obj/x86/Debug/ThreadTest.pdb
--------------------------------------------------------------------------------
/code/closure.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
25 |
26 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/css/PMAG.CSS:
--------------------------------------------------------------------------------
1 | html, body, div, span, applet, object, iframe,
2 | h1, h2, h3, h4, h5, h6, 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 | }
21 |
22 | #cover-image {
23 | width:100%;
24 | }
25 |
26 | h1, h2, h3, h4, h5, h6, p {
27 | color:#353535;
28 | }
29 |
30 | h1, h2, h3, h4, h5, h6 {
31 | margin: 0;
32 | font-family: '標楷體', 'Times New Roman';
33 | font-weight: bold;
34 | }
35 |
36 | blockquote {
37 | margin: 10px;
38 | padding-left: 10px;
39 | padding-right: 10px;
40 | padding-top: 1px;
41 | padding-bottom: 1px;
42 | border: 1px solid #373737;
43 | background-color: #efefef;
44 | }
45 |
46 | h1 { font-size: xx-large; text-align:center; margin:30px; }
47 |
48 | h2 { font-size: x-large; margin-top:30px; margin-bottom:30px; }
49 |
50 | h3 { font-size: large; }
51 |
52 | h4 { font-size: medium; }
53 |
54 | h5 { font-size: small }
55 |
56 | h6 { font-size: x-small; }
57 |
58 | h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight:bold; }
59 |
60 | h1, h1 a { color:#191970; }
61 | h2, h2 a { color:#050505; }
62 | h3, h3 a { color:#000066; }
63 | h4, h4 a { color:#000000; }
64 | h5, h5 a { color:#708090; }
65 | h6, h6 a { color:#000080; }
66 |
67 | p {
68 | margin: 10px 0 15px 0;
69 | font-size:100%;
70 | }
71 |
72 | li {
73 | font-size:100%;
74 | }
75 |
76 | footer p {
77 | color: #f2f2f2;
78 | }
79 |
80 | a {
81 | text-decoration: none;
82 | color: #007edf;
83 | text-shadow: none;
84 |
85 | transition: color 0.5s ease;
86 | transition: text-shadow 0.5s ease;
87 | -webkit-transition: color 0.5s ease;
88 | -webkit-transition: text-shadow 0.5s ease;
89 | -moz-transition: color 0.5s ease;
90 | -moz-transition: text-shadow 0.5s ease;
91 | -o-transition: color 0.5s ease;
92 | -o-transition: text-shadow 0.5s ease;
93 | -ms-transition: color 0.5s ease;
94 | -ms-transition: text-shadow 0.5s ease;
95 | }
96 |
97 | table {
98 | border-collapse: collapse;
99 | border-spacing: 0;
100 | border: 1px solid #373737;
101 | margin-bottom: 20px;
102 | text-align: left;
103 | margin-left:auto;
104 | margin-right:auto;
105 | }
106 |
107 | th {
108 | padding: 10px;
109 | background-color:black;
110 | color:white;
111 | }
112 |
113 | td {
114 | padding: 10px;
115 | border: 1px solid #373737;
116 | }
117 |
118 | em {
119 | font-weight:bold;
120 | }
121 |
122 | #header_wrap {
123 | margin: 0;
124 | padding: 16px;
125 | border: 0;
126 | font: inherit;
127 | vertical-align: baseline;
128 | background-color:black;
129 | color:white;
130 | }
131 |
132 | #header_wrap h1, h1 sub, h1 a {
133 | color:white;
134 | }
135 |
136 | h2 {
137 | color:black;
138 | }
139 |
140 | #header_wrap sub {
141 | color:white;
142 | font-size:60%;
143 | }
144 |
145 | .title, .author, .date {
146 | color:#333333;
147 | text-align:center;
148 | font-family: '標楷體', 'Times New Roman';
149 | }
150 |
151 | .title { font-size:xx-large; line-height:800%; }
152 |
153 | .author { font-size:large; line-height:300%; }
154 |
155 | .date { font-size:large; line-height:300%; }
156 |
157 |
158 | #content {
159 | margin:10px;
160 | padding:10px;
161 | }
162 |
163 | pre {
164 | border: 1px solid #373737;
165 | background-color:#dfdfdf;
166 | color:#3f3f3f;
167 | font-size:medium;
168 | width:95%;
169 | padding:10px;
170 | }
171 |
172 | .figure {
173 | margin:10px;
174 | padding:10px;
175 | margin-left: auto;
176 | margin-right: auto;
177 | display: block;
178 | }
179 |
180 | .figure img {
181 | border: 1px solid #373737;
182 | margin-left: auto;
183 | margin-right: auto;
184 | display: block;
185 | }
186 |
187 | .figure .caption {
188 | text-align:center;
189 | }
190 |
191 | #TOC {
192 | }
193 |
194 | #footer {
195 | text-align:center;
196 | font-size:small;
197 | color:#6f6f6f;
198 | margin: 10px;
199 | padding: 10px;
200 | }
201 |
202 | /* JavaScript Style */
203 | table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
204 | margin: 0; padding: 0; vertical-align: baseline; border: none; }
205 | table.sourceCode { width: 100%; }
206 | td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #afafaf; border-right: 1px solid #aaaaaa; }
207 | td.sourceCode { padding-left: 5px; }
208 | code > span.kw { color: #007020; font-weight: bold; }
209 | code > span.dt { color: #902000; }
210 | code > span.dv { color: #40a070; }
211 | code > span.bn { color: #40a070; }
212 | code > span.fl { color: #40a070; }
213 | code > span.ch { color: #4070a0; }
214 | code > span.st { color: #4070a0; }
215 | code > span.co { color: #60a0b0; font-style: italic; }
216 | code > span.ot { color: #007020; }
217 | code > span.al { color: #ff0000; font-weight: bold; }
218 | code > span.fu { color: #06287e; }
219 | code > span.er { color: #ff0000; font-weight: bold; }
220 |
221 |
--------------------------------------------------------------------------------
/htm/article1.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
27 |
28 |
29 |
30 |
33 |
34 |
Arduino入門教學(3) – LED 控制實驗 (作者:Copper Maa)
35 |
Lab1 Blinking a LED
36 |
實驗目的
37 |
讓一顆燈號閃爍,每隔一秒切換一次燈號。
38 |
材料
39 |
40 | Arduino 主板 x 1
41 | LED x 1
42 |
43 |
接線
44 |
45 | 把 LED 接到 Arduino 板子上,LED 長腳(陽極)接到 pin13,短腳(陰極)接到 GND,如下圖:
46 |
47 |
50 |
電路圖
51 |
54 |
如果你有電子背景,你可能注意到了一件事,我們的 LED 沒有串接電阻,這是因為 Arduino 的輸出電流很小不會燒壞 LED,所以才敢這麼做。少接一顆電阻是為了簡化,這樣初學者會學得比較輕鬆。一般來說,LED 串接一顆電阻是個好主意。
55 |
程式碼
56 |
/*
57 | Blink
58 | Turns on an LED on for one second, then off for one second, repeatedly.
59 |
60 | This example code is in the public domain.
61 | */
62 |
63 | void setup() {
64 | // initialize the digital pin as an output.
65 | // Pin 13 has an LED connected on most Arduino boards:
66 | pinMode(13 , OUTPUT);
67 | }
68 |
69 | void loop() {
70 | digitalWrite(13 , HIGH); // set the LED on
71 | delay(1000 ); // wait for a second
72 | digitalWrite(13 , LOW); // set the LED off
73 | delay(1000 ); // wait for a second
74 | }
75 |
說明:
76 |
77 | L11: pinMode(13, OUTPUT) 這行把 pin13 設置成 output pin
78 | L15: digitalWrite(13, HIGH) 這行供應 5V 電壓到 pin13,藉此打開 LED 燈號
79 | L16: delay(1000) 讓 CPU 閒置一秒鐘,讓 LED 燈號亮著一秒鐘
80 | L17: digitalWrite(13, LOW) 關閉燈號
81 | L18: delay(1000) 讓 CPU 閒置一秒鐘,讓 LED 燈號關閉一秒鐘
82 |
83 |
註:這支是 Arduino 內建的範例程式,點選 File > Examples > 1.Basics > Blink 就可以找到。
84 |
範例照片/影片
85 |
Youtube 上正好有段講解 Blinking a LED 的影片,我們來看看他的示範:
86 |
100 |
實驗二:使用按鍵控制 LED 燈號
101 |
實驗目的
102 |
使用按鍵 (PushButton)控制 LED 燈號的開關,當按鍵被按下時打開 LED 燈號,按鍵放開時關閉 LED 燈號。
103 |
材料
104 |
105 | Arduino 主板 x 1
106 | LED x 1
107 | PushButton 或 Switch 開關 x 1
108 | 10K 電阻 x 1
109 | 麵包板 x 1
110 | 單心線 x N
111 |
112 |
接線
113 |
114 | 把 LED 接到 pin13,長腳(陽極)接到 pin13,短腳(陰極)接到 GND
115 | PushButton 一支腳接到 +5V
116 | pin2 接到 Pushbutton 的另一支腳,同一支腳位接一個 10K 電阻連到 GND
117 |
118 |
121 |
電路圖
122 |
125 |
程式碼
126 |
const int buttonPin = 2 ; // the number of the pushbutton pin
127 | const int ledPin = 13 ; // the number of the LED pin
128 |
129 | // variables will change:
130 | int buttonState = 0 ; // variable for reading the pushbutton status
131 |
132 | void setup() {
133 | // initialize the LED pin as an output:
134 | pinMode(ledPin, OUTPUT);
135 | // initialize the pushbutton pin as an input:
136 | pinMode(buttonPin, INPUT);
137 | }
138 |
139 | void loop(){
140 | // read the state of the pushbutton value:
141 | buttonState = digitalRead(buttonPin);
142 |
143 | // check if the pushbutton is pressed.
144 | // if it is, the buttonState is HIGH:
145 | if (buttonState == HIGH) {
146 | // turn LED on:
147 | digitalWrite(ledPin, HIGH);
148 | }
149 | else {
150 | // turn LED off:
151 | digitalWrite(ledPin, LOW);
152 | }
153 | }
154 |
說明:
155 |
156 | L01~L02: 定義按鍵與 LED 的腳位,按鍵接在 pin2, 而 LED 接在 pin13
157 | L16: 讀取按鍵的狀態並保存到 buttonState 變數裏
158 | L20~L26: 這支程式的目的是按下按鍵時要打開 LED 燈號,放開按鍵時要關閉 LED 燈號,因此,假如 buttonState 為 HIGH,代表按鍵狀態是按下(pressed)的,此時要打開 LED,反之,假如 buttonState 為 LOW,代表按鍵狀態是放開的,此時要關閉 LED
159 |
160 |
註:這支是 Arduino 內建的範例程式,點選 File > Examples > 2.Digital > Button 就可以找到。
161 |
範例照片/影片
162 |
Youtube 上正好有段講解使用按鍵控制 LED 的影片,我們來看看他的示範:
163 |
177 |
注意!影片所用的範例程式,它是按下按鍵時關閉 LED 燈號,放開按鍵時打開 LED 燈號,邏輯與本文的範例相反。
178 |
動動腦
179 |
在不修改程式碼的條件下,讓 LED 變成在正常情況下是亮的,而當按下按鍵時讓 LED 燈號關掉。提示:條件是不能修改程式碼,要改變這支程式的行為,你只能夠動接線。
180 |
說明:
181 |
182 | L01~L02: 定義按鍵與 LED 的腳位,按鍵接在 pin2, 而 LED 接在 pin13
183 | L16: 讀取按鍵的狀態並保存到 buttonState 變數裏
184 | L20~L26: 這支程式的目的是按下按鍵時要打開 LED 燈號,放開按鍵時要關閉 LED 燈號,因此,假如 buttonState 為 HIGH,代表按鍵狀態是按下(pressed)的,此時要打開 LED,反之,假如 buttonState 為 LOW,代表按鍵狀態是放開的,此時要關閉 LED
185 |
186 |
註:這支是 Arduino 內建的範例程式,點選 File > Examples > 2.Digital > Button 就可以找到。
187 |
(本文作者為馬萬圳,原為網誌上的兩篇文章,經作者授權給程式人雜誌後由陳鍾誠編輯為此文,原文連結如下 http://coopermaa2nd.blogspot.tw/2010/12/arduino-lab1-blinking-led.html
, http://coopermaa2nd.blogspot.tw/2010/12/arduino-lab2-led.html
)
188 |
189 |
192 |
193 |
194 |
--------------------------------------------------------------------------------
/htm/article2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
27 |
28 |
29 |
30 |
33 |
34 |
JavaScript (3) – Closure 與匿名函數 (作者:陳鍾誠)
35 |
在以下的程式中,我們同時展示了 JavaScript 當中的全域變數、區域變數與匿名函數、Closure 等機制。在本文中,我們會用這個程式逐步解釋一些 JavaScript 語言中重要但詭異的概念。
36 |
很多語言都有全域變數與區域變數之分,在 JavaScript 當中看來也是如此,但事實上 JavaScript 的全域變數其實只是最外層領域的區域變數而已,在瀏覽器當中,這個最外層領域就是 window,所以以下程式中最後一部分的 sum 與 windows.sum 都同樣是 8。
37 |
程式:closure.htm
38 |
<html>
39 | <body>
40 |
41 | <script type= "text/javascript" >
42 | var sum = 0 ;
43 | function add(x) {
44 | sum += x;
45 | document .write ("typeof :x =" +typeof x+" y =" +typeof y+" z =" +typeof z+" sum =" +typeof sum+" <br />" );
46 | var y = 2 ;
47 | return function () {
48 | var z = x+y;
49 | document .write ("value :x =" +x+" y =" +y+" z =" +z+" sum =" +sum+" <br />" );
50 | document .write ("typeof :x =" +typeof x+" y =" +typeof y+" z =" +typeof z+" sum =" +typeof sum+" <br /><br />" );
51 | }
52 | }
53 |
54 | f = add(3 );
55 | f();
56 |
57 | add(5 )();
58 |
59 | document .write ("typeof :x =" +typeof x+" y =" +typeof y+" z =" +typeof z+" sum =" +typeof sum+" <br /><br />" );
60 |
61 | </script>
62 |
63 | <script type= "text/javascript" >
64 | document.write("sum="+sum+" window.sum="+window.sum);
65 | </script>
66 |
67 | </body>
68 | </html>
69 |
因此、JavaScript 可以說沒有全域變數的概念,全域變數的只不過是最外層物件的區域變數罷了。
70 |
在 JavaScript 每一層領域當中,都可以定義區域變數,例如在上述範例中,sum 是最外層變數,因此所有的程式區段都可以存取這個變數。
71 |
參數也是一種區域變數,像是 add(x) 當中的 x,也有領域慨念,其作用範圍僅適用於 add 裏面。而 add 當中所定義的區域變數 y,則只有在定義之後才會生效,因此其領域範圍是從 var y=2;
這行程式開始,一直到 add 函數結束為止。
72 |
JavaScript 當中的函數,可以沒有名稱,這種函數稱為匿名函數,像是上述範例的函數 add 中,就傳回了一個匿名函數,如下所示:
73 |
function add(x) {
74 | sum += x;
75 | document .write ("typeof:x=" +typeof x+" y=" +typeof y+" z=" +typeof z+" sum=" +typeof sum+"<br/>" );
76 | var y = 2 ;
77 | return function () {
78 | var z = sum+x+y;
79 | document .write ("value :x=" +x+" y=" +y+" z=" +z+" sum=" +sum+"<br/>" );
80 | document .write ("typeof:x=" +typeof x+" y=" +typeof y+" z=" +typeof z+" sum=" +typeof sum+"<br/><br/>" );
81 | }
82 | }
83 |
變數 z 是該匿名函數的區域變數,由於設定為 sum+x+y,因此存取了外層的 y、x 與更外層的 sum,領域的存取規則是內層可以存取外層的變數,但是外層卻不能存取內層的變數。
84 |
筆者認為,JavaScript 中的一個最特別且強大的特性,莫過於函數既可以塞給一般變數,也可以當參數傳遞。例如以下程式區段就是用 f 去接收 add(x) 函數所傳回來的匿名函數,然後再用 f() 函數去執行這個匿名函數而已。
85 |
f = add(3 );
86 | f();
87 |
88 | add(5 )();
89 |
上列程式碼的最後一行 add(5)()
,只不過是將這兩個動作合起來一起作,也就是呼叫 add(5) 後,傳回值是個匿名函數,然後再用「匿名函數()」這樣的方法呼叫函數,去執行該匿名函數而已。(這個功能有點像 C 當中的函數指標)
90 |
在上述的 closure.htm 程式中,還有個很特別的地方,就是這些匿名函數被傳回來後,就已經回到了最外層的領域範圍了 (window),那麼當該匿名函數執行時,照理說由於 x, y 屬於內層 add 函數的區域變數,應該會存取不到才對,但為何程式執行結果卻都還是正常,沒有發生錯誤呢?
91 |
這牽涉到 JavaScript 當中一個非常特別的機制,稱為 Closure (閉包)。
92 |
閉包與 JavaScript 的領域 (Scope) 特性有關,因為 JavaScript 採用 Lexical Scope,也就是變數作用範圍依照程式定義時的上下文 (Context) 所決定,而不是根據執行時期的上下文所決定的。
93 |
因此,上述匿名函數所服從的領域規則,仍然是定義時的領域,也就是 add 函數的子領域,而不是執行時期 window 的子領域,因此仍然可以正確存取 x,y,z 等變數,不會發生錯誤。
94 |
(JavaScript 的語法到此已經大致說明完畢,在下一期當中,筆者會將焦點轉移到 JavaScript 在瀏覽器中的運用上,看看 JavaScript 的實際用途,我們下期見!)
95 |
參考文獻
96 |
99 |
100 |
103 |
104 |
105 |
--------------------------------------------------------------------------------
/htm/article3.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
27 |
28 |
29 |
30 |
33 |
34 |
R 統計軟體:(1) 簡介與基本操作 – (作者:陳鍾誠)
35 |
簡介
36 |
R 軟體是專門為了機率統計而設計的一種開放原始碼軟體,是免費的自由軟體。
37 |
市面上有許多與 R 類似的商用軟體,像是 SPSS, SAS, MINITAB, S-PLUS 等,但是這些軟體是要花錢買的。
38 |
R 軟體所使用的程式語言,被稱為 R 語言。
39 |
R 語言 與 S-PLUS 所使用的語言很類似,兩者都衍生自貝爾實驗室 Rick Becker, Allan Wilks, John Chambers 所創造的 S 語言,R 語言基本上是 GNU 所實作的 S 語言版本。
40 |
筆者篆寫此文時,R 所採用的 S 語言演化到了第四版,因此稱為 S4。
41 |
安裝
42 |
R 軟體的官方網站為 http://www.r-project.org/
,其中有個相當重要的子網站稱為 CRAN (Comprehensive R Archive Network),其網址為 http://cran.r-project.org/
,您可以從這個網站中下載 R 軟體。
43 |
舉例而言,筆者使用的是 Windows作業系統,因此可以從以下網址下載到最新版的 R 軟體。
44 |
47 |
50 |
舉例而言,筆者點選時為 Download R 2.15.2 for Windows 這個連結, 這會下載位於下列網址的檔案:
51 |
54 |
下載完畢後,請啟動該安裝檔,然後不斷按「下一步」就可以完成安裝了,過程非常簡單。
55 |
以下網址中的 Youtube 影片介紹了 R 軟體的下載、安裝、套件、網站、電子書等等,有興趣的朋友可以看看。
56 |
59 |
基本操作
60 |
為了說明 R 軟體的用法,並用以學習機率統計的概念,本系列文章將運用 R 來說明機率統計的理論,讓程式人可以透過實作學會機率統計,並且學會 R 軟體中的 S 語言。
61 |
為了避免太過枯燥,我們將不會先介紹 R 的基本語法,而是先用一系列的操作,讓讀者體會 R 的能力,然後再慢慢回到語言的教學上面。
62 |
以下是筆者用 R 軟體取樣後會出樣本統計圖的畫面,簡單的幾個指令就可以得到統計結果,是不是很棒呢?
63 |
66 |
第一個指令 ?rnorm
是要求 R 軟體查詢 rnorm 這個指令,R 軟體會顯示以下的說明網頁,您可以看到 rnorm 指令是與常態分部 (The Normal Distribution) 有關的。
67 |
70 |
在 R 軟體中,對於任何一個機率分布 xxxx,都會實作出以 d, p, q, r 為字首的四種函數,例如對於常態分布 Normal Distribution (簡寫為 norm) 而言,就有 dnorm, pnorm, qnorm, rnorm 等四個函數,功能分別如下所示:
71 |
72 |
73 |
78 |
79 |
80 |
81 | dnorm
82 | 常態分布的機密度函數
83 | dnorm(x, mean = 0, sd = 1, log = FALSE)
84 |
85 |
86 | pnorm
87 | 常態分布的機分布函數
88 | pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
89 |
90 |
91 | qnorm
92 | 常態分布的分位數函數
93 | qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
94 |
95 |
96 | rnorm
97 | 常態分布隨機樣本函數
98 | rnorm(n, mean = 0, sd = 1)
99 |
100 |
101 |
102 |
上表中的 mean 代表平均數,sd 代表 Standard Deviation (標準差),n 是隨機產生的樣本個數,x 是隨機變數值,q 是累積值,p 是機率值,n 則是產生的樣本數。
103 |
您可以發現函數中,有些參數後面有 = 的指定 (像是 mean=0, sd=1, log=FALSE, ….),有些卻沒有 (像是 x, q, p, n) 等,這些指定代表預設值,也就是如果您不指定這些參數的値,那麼將會自動代入預設值。
104 |
所以 rnorm(100)
代表 rnorm(100, mean = 0, sd = 1)
的意思,也就是該函數會產生平均數為 mean=0,標準差為 sd=1 的隨機樣本共 100 個。
105 |
關於這些函數的更詳細的說明如下表所示。
106 |
107 |
108 |
114 |
115 |
116 |
117 | d
118 | 機率密度函數
119 | dnorm(1.96)
120 | P(X=x)
121 |
122 |
123 | p
124 | 累積機率函數(CDF)
125 | pnorm(1.96)=0.975
126 | P(X≤x)
127 |
128 |
129 | q
130 | 計算百分位數
131 | qnorm(0.975)=1.96
132 | q 系列為 p 系列的反函數; 所以 qnorm(pnorm(1.96)) = 1.96
133 |
134 |
135 | r
136 | 抽樣函數
137 | rnorm(100)
138 | 傳回 100 個標準常態分布的樣本向量
139 |
140 |
141 |
142 |
看懂這些函數之後,讓我們再度列出上圖的操作指令,仔細觀察看看每一個指令的意義。
143 |
?rnorm
144 |
145 | x = rnorm (10000 , mean= 5 , sd= 4 )
146 |
147 | hist (x)
148 |
指令 x = rnorm(10000, mean=5, sd=4)
代表我們要用平均值為 5, 標準差為 4 的常態分布,隨機產生 10000 個樣本,然後將這些樣本存到 x 陣列當中。
149 |
指令 hist(x)
代表要用這些樣本畫出統計的直方圖 (Histogram),於是就畫出了圖中的那個長條狀圖形。
150 |
現在、請讀者試著看看下列操作,看看您是否能夠讀懂這些操作的意義。
151 |
rnorm (10 , 3 , 2 )
152 | > x
153 | [1 ] 2.5810213 0.5399127 5.0005020 5.3402693 2.7900723 3.9638088 5.2119685
154 | [8 ] 2.2209882 2.9935943 7.0308419
155 | > a=dnorm (1.96 )
156 | > a
157 | [1 ] 0.05844094
158 | > b=pnorm (1.96 )
159 | > b
160 | [1 ] 0.9750021
161 | > c=qnorm (b)
162 | > c
163 | [1 ] 1.96
164 | > d=rnorm (10 )
165 | > d
166 | [1 ] -0.32913677 0.77788306 -1.80862496 0.16694598 -0.65656254 -1.76305925
167 | [7 ] 1.18237502 0.19651748 -0.07898685 0.73970933
168 | >
169 |
在下一期當中,我們將會用 R 統計軟體,示範如何進行敘述統計的操作,並說明這些操作的意義,我們下期見!
170 |
171 |
174 |
175 |
176 |
--------------------------------------------------------------------------------
/htm/article4.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
27 |
28 |
29 |
30 |
33 |
34 |
從 C# 看作業系統:(1) Thread 與 Deadlock 實作 – (作者:陳鍾誠)
35 |
很多資工系的學生都上過作業系統這門課,但是通常老師只有講理論,沒有說明如何實作,這讓很多同學都無法清楚的理解其中的概念。在本系列文章中,我們將使用 C# 語言來說明作業系統當中的一些關鍵概念,像是 Process (進程、行程、Task)、Thread (執行緒、線程)、Deadlock (死結)、Race Condition (競爭情況)、Semaphore (號誌、信號量) 等等。
36 |
Process 與 Thread
37 |
Thread 在台灣被稱為『執行緒』,但是在中國被稱為『線程』,作業系統教科書中通常會定義 Process 為:執行中的程式。因此假如您開了一個 Word 檔案,那就是有一個 Word 行程在執行,如果您又開了個命令列,那就是又有一個命令列行程在執行,如果又開第二個命令列,那就有兩個命令列行程在執行。
38 |
Thread 在作業系統中通常被定義為輕量級行程 (Light Weight Process),一個 Process 可以包含很多個 Thread,如下圖所示:
39 |
42 |
每個 Process 與 Thread 都會執行,而且執行到一半很可能就會因為進行輸出入或佔用 CPU 過久而被作業系統切換出去,改換另一個 Process 或 Thread 執行,這種概念稱為 Multitasking (多工)。
43 |
在 Windows 當中,我們可以按下 Ctrl-Alt-Del 鍵以顯示出系統的行程資訊,而在 Linux 中則可以用 ps (Process Status) 這個指令顯示行程資訊,以下是這兩個作業系統中的行程資訊範例。
44 |
47 |
Thread 交替執行的這種慨念可以用下圖表示。(Proces 也是如此,只是將圖中的 Thread 改為 Process 而已)
48 |
51 |
C# 中的 Thread 概念
52 |
在現代的作業系統當中,如果我們將一個程式重複執行兩次,將會產生兩個 Process ,那麼這兩個程式將是毫不相關的。任何一個程式都不需要知道另一個程式是否存在,通常也不會與另一個程式進行溝通。
53 |
但是,如果我們希望兩個程式能夠互相分享某些變數,但是卻又同時執行,此時就可以利用 Thread 的機制。對於程式設計師而言,Thread 就像一個可以單獨執行的函數,這個函數與其他程式 (包含主程式) 同時執行,感覺上好像互相獨立,但是又可以共用某些變數。以下是一個 C# 的 Thread 範例:
54 |
using System;
55 | using System.Threading ;
56 |
57 | class SimpleThread
58 | {
59 | String name;
60 |
61 | public static void Main (String[] args)
62 | {
63 | SimpleThread a = new SimpleThread ("A" );
64 | SimpleThread b = new SimpleThread ("B" );
65 | Thread athread = new Thread (new ThreadStart (a.run ));
66 | Thread bthread = new Thread (new ThreadStart (b.run ));
67 | athread.Start ();
68 | bthread.Start ();
69 | athread.Join ();
70 | bthread.Join ();
71 | }
72 |
73 | SimpleThread (String pName)
74 | {
75 | name = pName;
76 | }
77 |
78 | public void run ()
79 | {
80 | for (int i = 0 ; i < 10 ; i++)
81 | {
82 | String line = name + ":" + i;
83 | Console.WriteLine (line);
84 | // Thread.Sleep(10);
85 | }
86 | }
87 | }
88 |
其執行結果如下圖所示:
89 |
92 |
對於剛開始接觸 Thread 的程式人員而言,會感覺到相當的詭異。因為『兩個 Thread 同時執行』是一個相當難以理解的概念。事實上,對於只有一個 CPU 的程式而言,並非兩個程式真的會「同時」執行,而只不過是「交錯」執行而已。但是這個交錯方式是由作業系統決定的,而非由程式設計師自行安排。而對於多 CPU 或多核心的處理器而言,就真的會「同時」執行,而不是只有「交錯」執行而已。
93 |
通常,程式人員對於這種不能由自己操控決定的情況會有不安的感覺,但是當您多寫幾個程式之後,這種疑慮就會消除了,畢竟,程式人員本來就相當依賴作業系統,只是自己通常感覺不到而已。
94 |
當然,如果我們想要稍微控制一下 Thread 的執行順序,那麼就可以要求目前的 Thread 去休息睡覺,像是上述程式中的 Thread.Sleep(10) 這行程是本來是被註解掉的,但是如果我們將這行程式的註解拿掉,那麼將得到下列執行結果。
95 |
98 |
從上面兩個圖中,您可以看到還沒加入 Thread.Sleep(10) 之前,兩個 Thread 的交錯方是很隨興,基本上是由作業系統任意安排的,但是在加入 Thread.Sleep(10) 之後,因為兩個 Thread 在印一次後就會禮讓給對方,所以就成了嚴格交互的 A, B, A, B …. 之情形了。
99 |
以 C# 體驗 Deadlock 死結
100 |
在作業系統的課程當中我們會學到『死結』這個問題,當程式 1 抓住資源 A,卻又在等程式 2 釋放資源 B,而程式 2 則抓住資源 B ,卻又在等程式 1 釋放資源 A 的時候,就會進入死結狀態。這就像兩台很長的火車,互相卡住對方一般,下圖顯示了死結情況的示意圖。
101 |
104 |
在程式設計中我們真的會遇到死結嗎?如果真的有死結,能否寫一個會造成死結的程式呢?
105 |
這並不難,只要用執行緒 (Thread) 與鎖定 (lock) 機制,我們很容易就可以造出會導致死結的程式,以下是我們用 C# 撰寫的一段死結程式,請參考。
106 |
using System;
107 | using System.Threading ;
108 | using System.Text ;
109 |
110 | class ThreadTest
111 | {
112 | static StringBuilder A = new StringBuilder ("A" );
113 | static StringBuilder B = new StringBuilder ("B" );
114 |
115 | public static void Main (String[] args)
116 | {
117 | Thread thread1 = new Thread (new ThreadStart (AB));
118 | Thread thread2 = new Thread (new ThreadStart (BA));
119 | thread1.Start ();
120 | thread2.Start ();
121 | thread1.Join ();
122 | thread2.Join ();
123 | }
124 |
125 | public static void AB ()
126 | {
127 | lock (A)
128 | {
129 | Console.WriteLine ("AB.lock(A)" );
130 | Thread.Sleep (1000 );
131 | lock (B)
132 | {
133 | Console.WriteLine ("AB.lock(B)" );
134 | }
135 | }
136 | }
137 |
138 | public static void BA ()
139 | {
140 | lock (B)
141 | {
142 | Console.WriteLine ("BA.lock(B)" );
143 | Thread.Sleep (1000 );
144 | lock (A)
145 | {
146 | Console.WriteLine ("BA.lock(A)" );
147 | }
148 | }
149 | }
150 | }
151 |
上述程式的執行結果如下圖所示,當程式跑到 BA.lock(B) 之後就進入了死結,再也無法跑下去了,因此我們不會看到 BA.lock(A) 與 AB.lock(B) 這兩行輸出的結果,程式已經進入了死結狀態,再也出不來了。
152 |
155 |
至此,我們已經用 C# 實作了作業系統中的 Thread 與 Deadlock 這兩種慨念,以便讓讀者能透過實作真正的去感受作業系統,希望這樣的說明方式對讀者會有所幫助。
156 |
在下一期當中,我們將繼續利用 C# 說明作業系統中的 Race Condition (競爭情況) 概念與利用 lock 及 Semaphore 機制避免 Race Condition 的方法,我們下期見!
157 |
158 |
161 |
162 |
163 |
--------------------------------------------------------------------------------
/htm/home.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
關於程式人雜誌
16 |
程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌。
17 |
雜誌下載
18 |
42 |
本期內容
43 |
44 | 授權聲明
45 | 程式人短訊
46 |
51 | 程式人介紹
52 |
56 | 程式人頻道
57 |
60 | 程式人文集
61 |
67 | 雜誌訊息
68 |
69 |
雜誌訂閱
70 |
想訂閱程式人雜誌請按 雜誌訂閱 連結並填寫表單。
71 |
連絡我們
72 |
竭誠歡迎程式人投稿,或者成為本雜誌的專欄作家,現在就可以加入 程式人雜誌社團 一同共襄盛舉。
73 |
本雜誌編輯為「陳鍾誠 (@ccckmit)」,若要聯絡編輯,請寄信到 ccckmit at gmail dot com 。
79 |
80 |
83 |
84 |
85 |
--------------------------------------------------------------------------------
/htm/info.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
雜誌訊息
16 |
讀者訂閱
17 |
程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌,如果您願意成為本雜誌的專欄作家,請加入 程式人雜誌社團 一同共襄盛舉。
18 |
我們透過發行這本雜誌,希望讓大家可以讀到想讀的書,學到想學的技術,同時也讓寫作的朋友的作品能產生良好價值 – 那就是讓讀者根據雜誌的價值捐款給慈善團體。 讀雜誌做公益也不需要有壓力,您不需要每讀一本就急著去捐款,您可以讀了十本再捐,或者使用固定的月捐款方式,當成是雜誌訂閱費,或者是季捐款、一年捐一次等都 OK ! 甚至是單純當個讀者我們也都很歡迎! 本雜誌每期參考價:NT 50 元,如果您喜歡本雜誌,請將書款捐贈公益團體。例如可捐贈給「羅慧夫顱顏基金會 彰化銀行(009) 帳號:5234-01-41778-800」。(若匯款要加註可用「程式人雜誌」五個字)
19 |
想訂閱本雜誌的讀者,請按 雜誌訂閱 連結並填寫表單,我們會在每一期雜誌出刊時寄送通知與下載網址到您的信箱。
20 |
投稿須知
21 |
給專欄寫作者: 做公益不需要有壓力。如果您願意撰寫專欄,您可以輕鬆的寫,如果當月的稿件出不來,我們會安排其他稿件上場。
22 |
給網誌捐贈者: 如果您沒時間寫專欄或投稿,沒關係,只要將您的網誌以 [創作共用的「姓名標示、非商業性、相同方式分享」授權] 並通知我們,我們會自動從中選取需要的文章進行編輯,放入適當的雜誌當中出刊。
23 |
給文章投稿者: 程式人雜誌非常歡迎您加入作者的行列,如果您想撰寫任何文章或投稿,請用 markdown 或 LibreOffice 編輯好您的稿件,並於每個月 25 日前投稿到程式人雜誌社團 的檔案區,我們會盡可能將稿件編入隔月1號出版程式人雜誌當中,也歡迎您到社團中與我們一同討論。
24 |
如果您要投稿給程式人雜誌,請盡可能使用以下兩種方式:
25 |
26 | 使用 markdown 格式:markdown 的撰寫格式請參考 markdown樣版
27 | 使用 LibreOffice odt 格式:odt 格式請下載 odt樣版 。
28 |
29 |
關於以上兩種格式的寫法請下載 template.zip 以便瞭解寫作的方式與細節,請下載後閱讀 submit.md 檔案。
30 |
我們目前的編輯流程是用 pandoc 軟體將 markdown 轉換成 htm 與 epub 檔,然後再用 calibre 軟體中的 ebook-conver 指令將 epub 轉換為 pdf 與 mobi 檔案,如此就可以得到 htm, epub, pdf, mobi 等四種版本,而針對 pdf 檔我們還進一步區分為 A4 版與 ipad 版,以方便讀者根據需求自行取用。
31 |
參與編輯
32 |
您也可以擔任程式人雜誌的編輯,甚至創造一個全新的公益雜誌,我們誠摯的邀請您加入「開放公益出版」的行列,如果您想擔任編輯或創造新雜誌,也歡迎到 程式人雜誌社團 來與我們討論相關事宜。
33 |
公益資訊
34 |
35 |
36 |
37 |
38 |
39 |
40 |
46 |
47 |
48 |
49 | 財團法人羅慧夫顱顏基金會
50 | http://www.nncf.org/
lynn at nncf dot org 02-27190408分機 232
56 | 顱顏患者 (如唇顎裂、小耳症或其他罕見顱顏缺陷)
57 | 銀行:009彰化銀行民生分行 帳號:5234-01-41778-800
58 |
59 |
60 | 社團法人台灣省兒童少年成長協會
61 | http://www.cyga.org/
cyga99 at gmail dot com 04-23058005
67 | 單親、隔代教養.弱勢及一般家庭之兒童青少年
68 | 銀行:新光銀行 戶名:台灣省兒童少年成長協會 帳號:103-0912-10-000212-0
69 |
70 |
71 |
72 |
73 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/htm/license.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
授權聲明
16 |
本雜誌採用 創作共用:姓名標示、相同方式分享 授權,若您想要修改本書產生衍生著作時,至少應該遵守下列授權條件:
17 |
18 | 標示原作者姓名
19 | 採用 創作共用:姓名標示、相同方式分享 的方式公開衍生著作。
20 |
21 |
另外、當本雜誌中有文章或素材並非採用 姓名標示、相同方式分享 時,將會在該文章或素材後面標示其授權,此時該文章將以該標示的方式授權釋出,請修改者注意這些授權標示,以避免產生侵權糾紛。
22 |
例如有些文章可能不希望被作為「商業性使用」,此時就可能會採用創作共用:姓名標示、非商業性、相同方式分享 的授權,此時您就不應當將該文章用於商業用途上。
23 |
最後、懇請勿移除公益捐贈的相關描述,以便讓愛心得以持續散播!
24 |
25 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/htm/message1.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
法律短訊-創作共用授權間的相容性問題與疑惑
16 |
相容性問題
17 |
在前幾期的程式人雜誌中,我們都有引用並修改了維基百科的文章,然後採用 姓名標示、非商業性、相同方式分享 的 CC 授權方式分享整本雜誌,後來我收到 jserv 兄的 email 之後,才知道原來維基百科是採用 姓名標示、相同方式分享 的授權,而且更慘的是,這兩個授權互不相容,不能修改後以另一個授權釋出。
18 |
在 Remixing OER: A Guide to License Compatibility 這篇文章中,Creative Commons 組織說明了 CC 授權的相容性,並且畫出了一個相容矩陣,如下圖所示。
19 |
22 |
其中 BY-NC-SA 就是 姓名標示、非商業性、相同方式分享 授權,而 BY-SA 就是 姓名標示、相同方式分享 授權,而文章中對 BY-SA 授權的說明如下。
23 |
24 | This license lets others copy, share, modify and build upon your work even for commercial purposes, as long as they credit you and license new creations derived from your work under the same conditions.
25 |
26 |
由這段文字看來,SA (Share-Alike) 屬性的授權就必須用同樣授權進行分享,因此就不能將 BY-SA 改為 BY-NC-SA 授權分享了,雖然 BY-NC-SA 的分享條件事實上比 BY-SA 更嚴格。
27 |
前幾期授權錯誤的更正方式
28 |
由於 BY-SA 與 BY-NC-SA 兩者完全不能相容,因此本雜誌前兩期的做法,有些文章乃是修改自維基百科,然後整本雜誌標示 姓名標示、非商業性、相同方式分享 的方式就有錯誤了,因此筆者會將前兩期有修正自維基百科的文章改標示為 姓名標示、相同方式分享 授權,以更正此一錯誤。
29 |
這種方式我們目前認為應該可以符合 BY-SA 的授權規定,因為 BY-SA 的授權當中有下列描述:
30 |
31 | 「彙編」指文學或藝術創作的合集,例如百科全書及詩文選集,表演、錄音物或廣播,或除列舉於後述第1條第(h)項所列之著作以外的其他著作或保護標的。由於其內容之選擇與編排具有智慧創作性,且本著作於其中是以未經修改的完整形式,與一個或更多的作品,彼此間成為分離且獨立之著作,而共同彙集成的完整合集。為本授權條款之目的,構成彙編的著作,不會被視為改用作品(定義如上)。
32 |
33 |
而本雜誌基本上是一堆文章的彙編,因此我們將藉由此一方式修正前兩期的授權錯誤!
34 |
本期開始,「程式人雜誌」將採用與維基百科相容的 姓名標示、相同方式分享 授權,然後請投稿者盡可能用此一授權進行投稿,如果投稿者仍然覺得「非商業性」是必要條件的話,那我們將在該篇文章中單獨標示授權,以便盡可能的符合維基百科的授權規定。
35 |
筆者的疑惑
36 |
不過,筆者百思不解的一個問題是,為何 Lawrence Lessig 要用 Share-Alike 這個條件,將相容性鎖死,而不改用像 Share-Publicly (公開分享, SP) 這樣的條件呢?因為如果用 SP 取代 SA 的話,整個授權矩陣不就可以變成如下形式,授權間的相容性就會提高不少了阿!
37 |
38 |
39 |
48 |
49 |
50 |
51 | BY
52 | ○
53 | ○
54 | ○
55 | ○
56 | ○
57 | ○
58 |
59 |
60 | BY-NC
61 |
62 | ○
63 | ○
64 | ○
65 |
66 |
67 |
68 |
69 | BY-NC-ND
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | BY-NC-SP
79 |
80 |
81 | ○
82 | ○
83 |
84 |
85 |
86 |
87 | BY-ND
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 | BY-SP
97 |
98 |
99 | ○
100 | ○
101 | ○
102 | ○
103 |
104 |
105 |
106 |
由於筆者並非法律專家,也很難對「著作權法」目前的「合理使用」之範圍有明確的判斷力,但我們非常努力的想遵守「著作權法」與「創作共用」的規定,如果本雜誌在授權上仍有侵權問題的話,請來信告知,我們會盡可能符合法律規定。
107 |
另外、筆者希望知道這個問題答案的人,可以來信或留言告知上述問題的答案,以解筆者之惑阿!【本文由陳鍾誠撰寫】
108 |
109 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/htm/message2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
書籍短訊:電腦類的免費電子書網站
16 |
FreeComputerBooks 是筆者很常用來下載免費電子書的網站,這個網站其實是一個資訊類電子書的入口網站,經營者把他所找得到的資訊類電子書連結都蒐集在此,以下是該網站的網址。
17 |
20 |
以下是該網站的入口畫面,網站中包含了很詳細的分類,如果您需要合法的免費電腦書籍,可以考慮從
21 |
24 |
另外、Freetechbooks 也是一個同性質的網站,網址如下:
25 |
28 |
有了這兩個網站,相信程式人會很容易的找到您要的英文免費電子書。(不過可惜的是、中文的世界筆者還沒看到類似的入口網站,如果有讀者知道請記得告訴我!)【本文由陳鍾誠撰寫】
29 |
30 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/htm/message3.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
網路短訊-MOOC 大量線上教育
16 |
最近 MOOC (Massive Open Online Course) 突然變成了一個熱門名詞,翻譯成中文就是 (大規模開放線上課程)。數位時代雜誌與商業週刊都不約而同用這個主題當作封面故事,可見這個名詞的火紅程度真的很高。
17 |
2002 年 MIT 提出 Open Course Ware (OCW) 開放課程之後,很多學校都跟進採用 OCW 的方式釋出教材。在台灣、交通大學大概是最早採用 OCW 的學校,後來台大等許多學校也陸續跟進了,以下是台灣 OCW 的相關網址。
18 |
60 |
OCW 的特色是把學校老師的教材上傳,這些教材通常包含「講義、投影片、授課錄影、指定作業」等等,這種由學校主動要求老師將教材有系統性上傳做法在當年也算是一大進步,讓很多人受惠良多 (包含我在內)。
61 |
但是如果您看過這些課程,可能會發現自己很難從頭到尾看完,因為要把一門課從頭到尾看完,可能得每次看好幾個小時,然後看個十幾二十次,這對於網路世代講求速效的人們而言,真的很不容易。
62 |
MOOC 可以說是在 OCW 的基礎上更進了一步,主要特色是必須在網路上登錄註冊才可以開始上課,課程內容、編排與呈現方法都與 OCW 有所差別,教師不再是將上課從頭到尾進行錄影下來,而是專門針的一個主題,進行 10 分鐘左右的講解,然後會隨即附上一兩個作業或測驗,讓學員能夠透過該作業檢驗該主題是否已經學會了。由於需要登入才能上課,因此這些作業都可以直接在網路上作答。
63 |
66 |
如果你寫不出作業,想找同學討論,沒關係,課程上都附有討論區,讓同一門課的學員可以互相討論,充分理解之後再進行作答也可以。
67 |
那麼、這些作業與測驗由誰來批改呢?如果是選擇題的話,當然就可以由電腦直接批改沒有問題,但是如果是問答、數學證明或程式設計題的話,這些線上課程動不動就有五萬人同時登入上課,那麼老師一個人要改五萬份考卷不是改到手斷掉,於是有些 MOOC 平台會要求學員每個人要負責改隨機選出的 3-5 人作業,這樣老師的手就不會斷掉了 (但是學生的手會很痠!)。
68 |
當然、在這樣的機制上,作弊也是有可能的,但是這些課程登入時都會要求你按下誠實條款。畢竟、不誠則無物 (這不知道是哪個偉人所說的,我也忘了!)
69 |
72 |
MOOC 就是將這種「教學短片 => 作業測驗 => 討論作答」的方式,整合成一個網站,所有的學習都在這個網站上完成,這可以說是一種新型的教育模式,或許不久之後台灣也會有學校開始嘗試這種做法也說不定。
73 |
目前筆者所知道的 MOOC 平台網站有三個,分別是 Coursera, Udacity, edX,網址如下所示。
74 |
96 |
這些網站的背後,其實也都有相對應的學校在支援,而且最近開始也吸引了不少資金的投入,或許真的會形成一股教育新勢力也說不定。
97 |
更棒的是,當您修完課之後,只要付一些證書的費用 (通常一兩百美金),就可以取得證明書。當然、您得先通過這些測驗,至少要及格才行。
98 |
以下就是筆者慘痛的經驗,上去註冊之後每天都曠課,測驗完全沒有做,因此筆者在 MIT 的電子學課程上,竟然以零分的成績,被死當了,有圖為證:
99 |
102 |
雖然說這些證明書目前在台灣還沒有甚麼法律效用,不能拿來當作大學畢業證書,但是能拿到一張「MIT、史丹佛」等名校的某某課程證書,真的是酷炫到不行。這樣、不用出國也能到名校留學了!【本文由陳鍾誠撰寫】
103 |
104 |
107 |
108 |
109 |
--------------------------------------------------------------------------------
/htm/message4.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
16 |
17 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/htm/people1.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
開放原始碼之父–Richard Stallman
16 |
Richard Stallman 是開放原始碼領域最知名的人物之一,也是創造整個開源文化的始祖,他於 1983 年創建了 GNU 計畫,想建立一個類似 UNIX 的作業系統,雖然這個作業系統卻遲遲未能完成,但是 GNU 卻創造出了完成這個作業系統的大部分工具,像是 gcc, gdb, glibc, Emacs 等等,這讓後來的 (Linus Torvalds) 能夠在此基礎上創造出 Linux。
17 |
20 |
另外、Stallman 也創造出 GPL (GNU General Public License) 這個重要的開放原始碼授權,並且找了律師一起制定相關的法律條款,位開放原始碼的發展奠定了法律基礎。2001 年時,Lawrence Lessig 也是受到這類授權的啟發而創造出了 Creative Commons 創作共用授權,讓開放原始碼文化擴散到一般領域。
21 |
根據 Stallman 的傳記,他是因為想要改良一台 Xerox 9700 的雷射印表機的功能,槓上了全錄公司,由於該印表機沒有附上驅動程式的原始碼,並且拒絕 Stallman 等人的索取程式碼,所以才引發了他推展開放原始碼運動的想法。
22 |
這個故事告訴我們,有時候毫不起眼的小事,會改變你的一生,然後讓你變成偉人!
23 |
【本文由陳鍾誠取材並修改自維基百科】
24 |
25 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/htm/people2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
LLVM編譯器基礎架構的靈魂人物-Chris Lattner
16 |
前一篇文章中,我們介紹了開放原始碼之父 Richard Stallman ,他所創造的 GNU 組織,設計出了 gcc 的整套編譯器與工具鏈,對開放原始碼世界造成非常深遠的影響。現在、我們將介紹 Apple 所採用新一代編譯器 LLVM 的重要靈魂人物:Chris Lattner。
17 |
2000年,Chris Lattner 自奧勒岡州波特蘭大學(University of Portland)計算機科學系畢業後,進入伊利諾伊大學厄巴納-香檳分校 (University of Illinois at Urbana-Champaign ) 就讀。在此期間,他與維克拉姆·艾夫(Vikram Adve)發起 LLVM 專案,並於2003年發表。
18 |
LLVM 的全名是 Low Level Virtual Machine,因為 LLVM 的設計的初始目標是為所有靜態及動態語言創造出動態的編譯技術,但後來 LLVM 不斷的擴大之後,專案範圍已經不再侷限於虛擬機,成為以編譯器為核心的一個基礎架構,包含編譯、連結、除錯等等相關工具,其原始碼採用 BSD 的授權協定。
19 |
現在 LLVM 已經單純成為一個縮寫標記,適用於 LLVM 底下的所有專案,包含 LLVM 中介碼(LLVM IR)、LLDB 除錯工具、LLVM C++ 標準函式庫等等。
20 |
2005年,蘋果公司僱用了 Chris Lattner 及他的團隊,目的是將 LLVM 帶入蘋果公司,創立編譯器團隊並改進蘋果系統的速度與品質,並且同時啟動了 Clang 這個子計畫,負責改進蘋果系統的主要開發語言 Objective-C (同時支援 C/C++)、將 LLVM 納入到蘋果開發工具 Xcode 中,並且開始孕育並培養 LLVM 的開放原始碼社群。
21 |
2010 年,ACM 組織的 SIGPLAN 團體頒贈了「程式語言軟體獎」(Programming Languages Software Award) 給 Chris Lattner,以表彰他在 LLVM 上的貢獻,
22 |
LLVM 目前支援 Ada、C、C++、D、Fortran 及 Objective-C 等語言,也有人寫了 Haskell 的 LLVM 編譯器。現在、LLVM 已經成為 GNU 編譯器工具鏈 gcc 的一個競爭方案。而且、由於 gcc 已經是個歷史悠久的專案了,相對的很多程式碼也會比較陳舊而難以維護,因此 LLVM 或許能取代 gcc 而成為未來開放原始碼領域的主要編譯工具也說不定,因為 LLVM 的架構感覺上比 gcc 更清楚,更容易維護。
23 |
LLVM 編譯器基本上屬於彈性的三層式編譯器架構,基本上可分為 Frontend (前端)、IR 與最佳化、Backend (後端) 等幾部分,這種方式可以有效的將「高階語言」與「目標語言」兩者分離開來,形成一個多對多的架構,會比較容易就可以加入新的高階語言,或者產生新的目標語言,此種架構如下圖所示。
24 |
27 |
在編譯器領域,已經有不少人開始高度注意 LLVM 這個專案,並且實際在各個領域,您可以在 http://llvm.org/docs/
當中找到 LLVM 的相關技術資訊。
28 |
特別值得一提的是,筆者正在進行的「開放電腦計畫」這個企圖自行建立 「CPU、Assembler、Compiler、OS、虛擬機」的計畫中,原本進度稍嫌緩慢,但是在我大哥決定為此計畫的處理器 CPU0 寫一個 LLVM Backend 程式,並寫出了 Tutorial: Creating an LLVM Backend for the Cpu0 Architecture 這本書籍之後,就往前邁進了很多。有了 LLVM Backend 的技術,就讓我們有機會可以用標準的 C 語言將現成的小型作業系統,像是 UNIXv6、MINIX 或 RTThread 等作業系統,移植到 CPU0 上,以便完成整個計畫了。
29 |
參考文獻
30 |
39 |
【本文由陳鍾誠取材並修改自維基百科】
40 |
41 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/htm/video1.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
看影片學 C# 視窗程式設計
16 |
C# 是微軟平台的主力語言,用來寫 Windows 系統的程式非常好用,也是很多學生學習視窗程式設計的捷徑。
17 |
但是在學習視窗程式設計的時候,只看書往往會覺得有點學習障礙,這是因為 C# 的開發工具 Visual Studio 實在設計得太好的關係。
18 |
Visual Studio 我們可以用視覺化拖拉的方式,輕易的進行視窗界面設計,這些拖拉動作所產生的界面程式碼數量很多,我們通常很難直接用打字的方式設計,於是 C# 的視窗程式就和 Visual Studio 這個開發工具緊密的結合在一起了。
19 |
傳統的紙本書籍很難傳達這種視覺化界面操作的訊息,於是很多人買了一堆 C# 視窗程式設計書籍後,還是沒有辦法學會視窗程式。
20 |
針對這個問題,筆者的建議是利用書籍搭配教學影片一起學習,這樣既能傳達與程式相關的文字訊息,又能傳達與視覺化操作的影音訊息,兩者適當的搭配就能比較有效率的學會視窗程式設計了。
21 |
筆者自己在金門大學中教授視窗程式設計也有數年了,為了讓學生學會這個領域,我用自己熟悉的 wikidot 創建了一個針對 C# 而設計的網站,網址是 http://cs0.wikidot.com
,如果您想學習 C# 視窗程式,建議您可以從這裡開始出發。
22 |
在網站中,我們從基本的 C# 語法開始介紹、然後進入物件導向、接著才進入函式庫、檔案與 Windows Form 視窗程式,對於這些主題,筆者幾乎都會將自己上課的內容進行全程錄影,初學者如果能從頭開始閱讀這些文章並觀賞影片,應該可以很容易的進入 C# 視窗程式的領域才對。
23 |
C# 基礎程式設計
24 |
98 |
99 |
185 |
對於已經熟悉微軟程式設計的人而言,可能會發現我們使用的是較舊的 Windows Form 視窗架構,而非較新的 WPF (Windows Presentation Foundation) 架構,因為筆者並沒有採用 WPF 進行課堂教學的關係,不過還好,「曹祖聖」先生已經為微軟錄製了一系列的 WPF 的影音開發教材,如果您有興趣,可以到以下網頁中觀賞學習。(由於該網頁的影音採用微軟的 Silverlight,因此您必須先安裝 Silverlight 虛擬機後才能觀賞這些影片)
186 |
200 |
C# 網路程式設計 – 使用 Socket 函式庫
201 |
227 |
228 |
231 |
232 |
233 |
--------------------------------------------------------------------------------
/img/640px-Rms_at_pitt.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/640px-Rms_at_pitt.jpg
--------------------------------------------------------------------------------
/img/CSharpDeadlockRun1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/CSharpDeadlockRun1.jpg
--------------------------------------------------------------------------------
/img/CSharpThreadRun1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/CSharpThreadRun1.jpg
--------------------------------------------------------------------------------
/img/CSharpThreadRun2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/CSharpThreadRun2.jpg
--------------------------------------------------------------------------------
/img/Deadlock.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/Deadlock.jpg
--------------------------------------------------------------------------------
/img/FileMultithreadedProcess.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/FileMultithreadedProcess.jpg
--------------------------------------------------------------------------------
/img/FreeComputerBooks_page.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/FreeComputerBooks_page.jpg
--------------------------------------------------------------------------------
/img/Htop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/Htop.png
--------------------------------------------------------------------------------
/img/MIT_MOOC_exam.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/MIT_MOOC_exam.jpg
--------------------------------------------------------------------------------
/img/MIT_MOOC_grade.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/MIT_MOOC_grade.jpg
--------------------------------------------------------------------------------
/img/MIT_MOOC_page.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/MIT_MOOC_page.jpg
--------------------------------------------------------------------------------
/img/ProcessScreenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/ProcessScreenshot.jpg
--------------------------------------------------------------------------------
/img/ProcessVsThread.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/ProcessVsThread.jpg
--------------------------------------------------------------------------------
/img/R_download_page.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/R_download_page.jpg
--------------------------------------------------------------------------------
/img/R_help.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/R_help.jpg
--------------------------------------------------------------------------------
/img/R_run.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/R_run.jpg
--------------------------------------------------------------------------------
/img/RetargetableCompiler.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/RetargetableCompiler.png
--------------------------------------------------------------------------------
/img/arduino_led2_board1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/arduino_led2_board1.png
--------------------------------------------------------------------------------
/img/arduino_led2_chip1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/arduino_led2_chip1.png
--------------------------------------------------------------------------------
/img/arduino_led_board1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/arduino_led_board1.png
--------------------------------------------------------------------------------
/img/arduino_led_chip1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/arduino_led_chip1.png
--------------------------------------------------------------------------------
/img/cc_matrix.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/cc_matrix.jpg
--------------------------------------------------------------------------------
/img/pmag_cover.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/pmag_cover.jpg
--------------------------------------------------------------------------------
/img/pmag_cover_A4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/pmag_cover_A4.png
--------------------------------------------------------------------------------
/img/table_css_embed.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/img/table_css_embed.jpg
--------------------------------------------------------------------------------
/source/HEADER.HTM:
--------------------------------------------------------------------------------
1 |
4 |
5 |
--------------------------------------------------------------------------------
/source/Makefile:
--------------------------------------------------------------------------------
1 | PANDOC = pandoc -s -S
2 | HTM = home.html license.html message1.html message2.html message3.html message4.html people1.html people2.html video1.html article1.html article2.html article3.html article4.html info.html
3 | # MD = message.md message1.md message2.md message3.md message4.md people.md people1.md people2.md video.md video1.md article.md article1.md article2.md article3.md article4.md info.md
4 | MD = license.md message.md message1.md message2.md message3.md message4.md people.md people1.md people2.md video.md video1.md article.md article1.md article2.md article3.md article4.md info.md reflink.md
5 | HFLAGS = -c ../css/pmag.css -B header.htm -A footer.htm
6 | RM = rm -f
7 | EOPT = --margin-top=16 --margin-bottom=16 --margin-left=20 --margin-right=20 --pretty-print --base-font-size=9 --font-size-mapping="7, 8, 9, 12, 14, 16, 20, 24"
8 | EOPT1 = --output-profile=ipad3 --extra-css=../css/pmag.css --margin-top=16 --margin-bottom=16 --margin-left=20 --margin-right=20 --base-font-size=10 --disable-font-rescaling --font-size-mapping="7, 8, 10, 12, 14, 16, 20, 24"
9 |
10 | .PHONY: all clean
11 |
12 | all: $(HTM)
13 |
14 | epubA4:
15 | $(PANDOC) -S --toc --epub-metadata=metadata.xml --epub-stylesheet=../css/pmag.css --epub-cover-image=../img/pmag_cover_A4.png toc.md $(MD) -o ../book/pmag201303A4.epub
16 |
17 | pdfA4: epubA4
18 | ebook-convert ../book/pmag201303A4.epub ../book/pmag201303A4.pdf $(EOPT) --paper-size=a4
19 |
20 | epubipad:
21 | $(PANDOC) -S --toc --epub-metadata=metadata.xml --epub-stylesheet=../css/pmag.css --epub-cover-image=../img/pmag_cover.jpg toc.md $(MD) -o ../book/pmag201303ipad.epub
22 |
23 | pdfipad: epubipad
24 | ebook-convert ../book/pmag201303ipad.epub ../book/pmag201303ipad.pdf $(EOPT) --output-profile=ipad3
25 |
26 | mobi: epub
27 | ebook-convert ../book/pmag201303.epub ../book/pmag201303ipad3.mobi $(EOPT) --output-profile=ipad3
28 |
29 | tex:
30 | $(PANDOC) --chapters --template=A4.tex -S --toc $(MD) -o pmag201303A4.tex
31 |
32 | xml:
33 | $(PANDOC) --chapters -w opendocument -S --toc $(MD) -o ../book/pmag201303A4.xml
34 |
35 | htm: $(HTM)
36 |
37 | shtm:
38 | $(PANDOC) --toc $(MD) -o ../book/pmag201303.html $(HFLAGS)
39 |
40 | %.html: %.md
41 | $(PANDOC) $< reflink.md -o ../htm/$@ $(HFLAGS)
42 |
43 | clean:
44 | ${RM} ../htm/*.*
45 |
46 |
--------------------------------------------------------------------------------
/source/article.md:
--------------------------------------------------------------------------------
1 |
2 | # 程式人文集
3 |
--------------------------------------------------------------------------------
/source/article1.md:
--------------------------------------------------------------------------------
1 | ## Arduino入門教學(3) – LED 控制實驗 (作者:Copper Maa)
2 |
3 | ### Lab1 Blinking a LED
4 |
5 | #### 實驗目的
6 |
7 | 讓一顆燈號閃爍,每隔一秒切換一次燈號。
8 |
9 | #### 材料
10 |
11 | * Arduino 主板 x 1
12 | * LED x 1
13 |
14 | #### 接線
15 |
16 | * 把 LED 接到 Arduino 板子上,LED 長腳(陽極)接到 pin13,短腳(陰極)接到 GND,如下圖:
17 |
18 | 
19 |
20 | #### 電路圖
21 |
22 | 
23 |
24 | 如果你有電子背景,你可能注意到了一件事,我們的 LED 沒有串接電阻,這是因為 Arduino 的輸出電流很小不會燒壞 LED,所以才敢這麼做。少接一顆電阻是為了簡化,這樣初學者會學得比較輕鬆。一般來說,LED 串接一顆電阻是個好主意。
25 |
26 | #### 程式碼
27 |
28 | ```CPP
29 | /*
30 | Blink
31 | Turns on an LED on for one second, then off for one second, repeatedly.
32 |
33 | This example code is in the public domain.
34 | */
35 |
36 | void setup() {
37 | // initialize the digital pin as an output.
38 | // Pin 13 has an LED connected on most Arduino boards:
39 | pinMode(13, OUTPUT);
40 | }
41 |
42 | void loop() {
43 | digitalWrite(13, HIGH); // set the LED on
44 | delay(1000); // wait for a second
45 | digitalWrite(13, LOW); // set the LED off
46 | delay(1000); // wait for a second
47 | }
48 | ```
49 |
50 | #### 說明:
51 |
52 | * L11: pinMode(13, OUTPUT) 這行把 pin13 設置成 output pin
53 | * L15: digitalWrite(13, HIGH) 這行供應 5V 電壓到 pin13,藉此打開 LED 燈號
54 | * L16: delay(1000) 讓 CPU 閒置一秒鐘,讓 LED 燈號亮著一秒鐘
55 | * L17: digitalWrite(13, LOW) 關閉燈號
56 | * L18: delay(1000) 讓 CPU 閒置一秒鐘,讓 LED 燈號關閉一秒鐘
57 |
58 | 註:這支是 Arduino 內建的範例程式,點選 File > Examples > 1.Basics > Blink 就可以找到。
59 |
60 | #### 範例照片/影片
61 |
62 | Youtube 上正好有段講解 Blinking a LED 的影片,我們來看看他的示範:
63 |
64 | 影片名稱 網址
65 | ----------------------------- -------------------------------
66 | How-to Tuesday: Arduino 101 the LED
67 |
68 |
69 | ### 實驗二:使用按鍵控制 LED 燈號
70 |
71 | #### 實驗目的
72 |
73 | 使用按鍵 (PushButton)控制 LED 燈號的開關,當按鍵被按下時打開 LED 燈號,按鍵放開時關閉 LED 燈號。
74 |
75 | #### 材料
76 | * Arduino 主板 x 1
77 | * LED x 1
78 | * PushButton 或 Switch 開關 x 1
79 | * 10K 電阻 x 1
80 | * 麵包板 x 1
81 | * 單心線 x N
82 |
83 | #### 接線
84 |
85 | * 把 LED 接到 pin13,長腳(陽極)接到 pin13,短腳(陰極)接到 GND
86 | * PushButton 一支腳接到 +5V
87 | * pin2 接到 Pushbutton 的另一支腳,同一支腳位接一個 10K 電阻連到 GND
88 |
89 | 
90 |
91 |
92 | #### 電路圖
93 |
94 | 
95 |
96 | #### 程式碼
97 |
98 | ```CPP
99 | const int buttonPin = 2; // the number of the pushbutton pin
100 | const int ledPin = 13; // the number of the LED pin
101 |
102 | // variables will change:
103 | int buttonState = 0; // variable for reading the pushbutton status
104 |
105 | void setup() {
106 | // initialize the LED pin as an output:
107 | pinMode(ledPin, OUTPUT);
108 | // initialize the pushbutton pin as an input:
109 | pinMode(buttonPin, INPUT);
110 | }
111 |
112 | void loop(){
113 | // read the state of the pushbutton value:
114 | buttonState = digitalRead(buttonPin);
115 |
116 | // check if the pushbutton is pressed.
117 | // if it is, the buttonState is HIGH:
118 | if (buttonState == HIGH) {
119 | // turn LED on:
120 | digitalWrite(ledPin, HIGH);
121 | }
122 | else {
123 | // turn LED off:
124 | digitalWrite(ledPin, LOW);
125 | }
126 | }
127 | ```
128 |
129 | #### 說明:
130 | * L01~L02: 定義按鍵與 LED 的腳位,按鍵接在 pin2, 而 LED 接在 pin13
131 | * L16: 讀取按鍵的狀態並保存到 buttonState 變數裏
132 | * L20~L26: 這支程式的目的是按下按鍵時要打開 LED 燈號,放開按鍵時要關閉 LED 燈號,因此,假如 buttonState 為 HIGH,代表按鍵狀態是按下(pressed)的,此時要打開 LED,反之,假如 buttonState 為 LOW,代表按鍵狀態是放開的,此時要關閉 LED
133 |
134 | 註:這支是 Arduino 內建的範例程式,點選 File > Examples > 2.Digital > Button 就可以找到。
135 |
136 | #### 範例照片/影片
137 |
138 | Youtube 上正好有段講解使用按鍵控制 LED 的影片,我們來看看他的示範:
139 |
140 | 影片名稱 網址
141 | -------------------------------------- -------------------------------
142 | How-to Tuesday: Arduino 101 the button
143 |
144 |
145 | 注意!影片所用的範例程式,它是按下按鍵時關閉 LED 燈號,放開按鍵時打開 LED 燈號,邏輯與本文的範例相反。
146 |
147 | #### 動動腦
148 |
149 | 在不修改程式碼的條件下,讓 LED 變成在正常情況下是亮的,而當按下按鍵時讓 LED 燈號關掉。提示:條件是不能修改程式碼,要改變這支程式的行為,你只能夠動接線。
150 |
151 | #### 說明:
152 | * L01~L02: 定義按鍵與 LED 的腳位,按鍵接在 pin2, 而 LED 接在 pin13
153 | * L16: 讀取按鍵的狀態並保存到 buttonState 變數裏
154 | * L20~L26: 這支程式的目的是按下按鍵時要打開 LED 燈號,放開按鍵時要關閉 LED 燈號,因此,假如 buttonState 為 HIGH,代表按鍵狀態是按下(pressed)的,此時要打開 LED,反之,假如 buttonState 為 LOW,代表按鍵狀態是放開的,此時要關閉 LED
155 |
156 | 註:這支是 Arduino 內建的範例程式,點選 File > Examples > 2.Digital > Button 就可以找到。
157 |
158 | (本文作者為馬萬圳,原為網誌上的兩篇文章,經作者授權給程式人雜誌後由陳鍾誠編輯為此文,原文連結如下 , )
159 |
160 |
--------------------------------------------------------------------------------
/source/article2.md:
--------------------------------------------------------------------------------
1 | ## JavaScript (3) – Closure 與匿名函數 (作者:陳鍾誠)
2 |
3 | 在以下的程式中,我們同時展示了 JavaScript 當中的全域變數、區域變數與匿名函數、Closure 等機制。在本文中,我們會用這個程式逐步解釋一些 JavaScript 語言中重要但詭異的概念。
4 |
5 | 很多語言都有全域變數與區域變數之分,在 JavaScript 當中看來也是如此,但事實上 JavaScript 的全域變數其實只是最外層領域的區域變數而已,在瀏覽器當中,這個最外層領域就是 window,所以以下程式中最後一部分的 sum 與 windows.sum 都同樣是 8。
6 |
7 | 程式:closure.htm
8 |
9 | ```Html
10 |
11 |
12 |
13 |
34 |
35 |
38 |
39 |
40 |
41 | ```
42 |
43 | 因此、JavaScript 可以說沒有全域變數的概念,全域變數的只不過是最外層物件的區域變數罷了。
44 |
45 | 在 JavaScript 每一層領域當中,都可以定義區域變數,例如在上述範例中,sum 是最外層變數,因此所有的程式區段都可以存取這個變數。
46 |
47 | 參數也是一種區域變數,像是 add(x) 當中的 x,也有領域慨念,其作用範圍僅適用於 add 裏面。而 add 當中所定義的區域變數 y,則只有在定義之後才會生效,因此其領域範圍是從 `var y=2;` 這行程式開始,一直到 add 函數結束為止。
48 |
49 | JavaScript 當中的函數,可以沒有名稱,這種函數稱為匿名函數,像是上述範例的函數 add 中,就傳回了一個匿名函數,如下所示:
50 |
51 | ```JavaScript
52 | function add(x) {
53 | sum += x;
54 | document.write("typeof:x="+typeof x+" y="+typeof y+" z="+typeof z+" sum="+typeof sum+" ");
55 | var y = 2;
56 | return function() {
57 | var z = sum+x+y;
58 | document.write("value :x="+x+" y="+y+" z="+z+" sum="+sum+" ");
59 | document.write("typeof:x="+typeof x+" y="+typeof y+" z="+typeof z+" sum="+typeof sum+" ");
60 | }
61 | }
62 | ```
63 |
64 | 變數 z 是該匿名函數的區域變數,由於設定為 sum+x+y,因此存取了外層的 y、x 與更外層的 sum,領域的存取規則是內層可以存取外層的變數,但是外層卻不能存取內層的變數。
65 |
66 | 筆者認為,JavaScript 中的一個最特別且強大的特性,莫過於函數既可以塞給一般變數,也可以當參數傳遞。例如以下程式區段就是用 f 去接收 add(x) 函數所傳回來的匿名函數,然後再用 f() 函數去執行這個匿名函數而已。
67 |
68 | ```JavaScript
69 | f = add(3);
70 | f();
71 |
72 | add(5)();
73 | ```
74 |
75 | 上列程式碼的最後一行 `add(5)()`,只不過是將這兩個動作合起來一起作,也就是呼叫 add(5) 後,傳回值是個匿名函數,然後再用「匿名函數()」這樣的方法呼叫函數,去執行該匿名函數而已。(這個功能有點像 C 當中的函數指標)
76 |
77 | 在上述的 closure.htm 程式中,還有個很特別的地方,就是這些匿名函數被傳回來後,就已經回到了最外層的領域範圍了 (window),那麼當該匿名函數執行時,照理說由於 x, y 屬於內層 add 函數的區域變數,應該會存取不到才對,但為何程式執行結果卻都還是正常,沒有發生錯誤呢?
78 |
79 | 這牽涉到 JavaScript 當中一個非常特別的機制,稱為 Closure (閉包)。
80 |
81 | 閉包與 JavaScript 的領域 (Scope) 特性有關,因為 JavaScript 採用 Lexical Scope,也就是變數作用範圍依照程式定義時的上下文 (Context) 所決定,而不是根據執行時期的上下文所決定的。
82 |
83 | 因此,上述匿名函數所服從的領域規則,仍然是定義時的領域,也就是 add 函數的子領域,而不是執行時期 window 的子領域,因此仍然可以正確存取 x,y,z 等變數,不會發生錯誤。
84 |
85 | (JavaScript 的語法到此已經大致說明完畢,在下一期當中,筆者會將焦點轉移到 JavaScript 在瀏覽器中的運用上,看看 JavaScript 的實際用途,我們下期見!)
86 |
87 | ### 參考文獻
88 | * Node.js 中文電子書 » JavaScript 與 NodeJS --
89 |
90 |
--------------------------------------------------------------------------------
/source/article3.md:
--------------------------------------------------------------------------------
1 | ## R 統計軟體:(1) 簡介與基本操作 -- (作者:陳鍾誠)
2 |
3 | ### 簡介
4 |
5 | R 軟體是專門為了機率統計而設計的一種開放原始碼軟體,是免費的自由軟體。
6 |
7 | 市面上有許多與 R 類似的商用軟體,像是 SPSS, SAS, MINITAB, S-PLUS 等,但是這些軟體是要花錢買的。
8 |
9 | R 軟體所使用的程式語言,被稱為 R 語言。
10 |
11 | R 語言 與 S-PLUS 所使用的語言很類似,兩者都衍生自貝爾實驗室 Rick Becker, Allan Wilks, John Chambers 所創造的 S 語言,R 語言基本上是 GNU 所實作的 S 語言版本。
12 |
13 | 筆者篆寫此文時,R 所採用的 S 語言演化到了第四版,因此稱為 S4。
14 |
15 | ### 安裝
16 |
17 | R 軟體的官方網站為 ,其中有個相當重要的子網站稱為 CRAN (Comprehensive R Archive Network),其網址為 ,您可以從這個網站中下載 R 軟體。
18 |
19 | 舉例而言,筆者使用的是 Windows作業系統,因此可以從以下網址下載到最新版的 R 軟體。
20 |
21 | *
22 |
23 | 
24 |
25 | 舉例而言,筆者點選時為 Download R 2.15.2 for Windows 這個連結, 這會下載位於下列網址的檔案:
26 |
27 | *
28 |
29 | 下載完畢後,請啟動該安裝檔,然後不斷按「下一步」就可以完成安裝了,過程非常簡單。
30 |
31 | 以下網址中的 Youtube 影片介紹了 R 軟體的下載、安裝、套件、網站、電子書等等,有興趣的朋友可以看看。
32 |
33 | *
34 |
35 | ### 基本操作
36 |
37 | 為了說明 R 軟體的用法,並用以學習機率統計的概念,本系列文章將運用 R 來說明機率統計的理論,讓程式人可以透過實作學會機率統計,並且學會 R 軟體中的 S 語言。
38 |
39 | 為了避免太過枯燥,我們將不會先介紹 R 的基本語法,而是先用一系列的操作,讓讀者體會 R 的能力,然後再慢慢回到語言的教學上面。
40 |
41 | 以下是筆者用 R 軟體取樣後會出樣本統計圖的畫面,簡單的幾個指令就可以得到統計結果,是不是很棒呢?
42 |
43 | 
44 |
45 | 第一個指令 `?rnorm` 是要求 R 軟體查詢 rnorm 這個指令,R 軟體會顯示以下的說明網頁,您可以看到 rnorm 指令是與常態分部 (The Normal Distribution) 有關的。
46 |
47 | 
48 |
49 | 在 R 軟體中,對於任何一個機率分布 xxxx,都會實作出以 d, p, q, r 為字首的四種函數,例如對於常態分布 Normal Distribution (簡寫為 norm) 而言,就有 dnorm, pnorm, qnorm, rnorm 等四個函數,功能分別如下所示:
50 |
51 | 函數 說明 語法
52 | -------- ------------------------- -----------------------------------------------------------------
53 | dnorm 常態分布的機密度函數 dnorm(x, mean = 0, sd = 1, log = FALSE)
54 | pnorm 常態分布的機分布函數 pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
55 | qnorm 常態分布的分位數函數 qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
56 | rnorm 常態分布隨機樣本函數 rnorm(n, mean = 0, sd = 1)
57 |
58 | 上表中的 mean 代表平均數,sd 代表 Standard Deviation (標準差),n 是隨機產生的樣本個數,x 是隨機變數值,q 是累積值,p 是機率值,n 則是產生的樣本數。
59 |
60 | 您可以發現函數中,有些參數後面有 = 的指定 (像是 mean=0, sd=1, log=FALSE, ....),有些卻沒有 (像是 x, q, p, n) 等,這些指定代表預設值,也就是如果您不指定這些參數的値,那麼將會自動代入預設值。
61 |
62 | 所以 `rnorm(100)` 代表 `rnorm(100, mean = 0, sd = 1)` 的意思,也就是該函數會產生平均數為 mean=0,標準差為 sd=1 的隨機樣本共 100 個。
63 |
64 | 關於這些函數的更詳細的說明如下表所示。
65 |
66 | 字首 函數意義 範例 說明
67 | ------ ----------------- ------------------- -----------------------------------------------------------------
68 | d 機率密度函數 dnorm(1.96) P(X=x)
69 | p 累積機率函數(CDF) pnorm(1.96)=0.975 P(X≤x)
70 | q 計算百分位數 qnorm(0.975)=1.96 q 系列為 p 系列的反函數; 所以 qnorm(pnorm(1.96)) = 1.96
71 | r 抽樣函數 rnorm(100) 傳回 100 個標準常態分布的樣本向量
72 |
73 | 看懂這些函數之後,讓我們再度列出上圖的操作指令,仔細觀察看看每一個指令的意義。
74 |
75 | ```R
76 | ?rnorm
77 |
78 | x = rnorm(10000, mean=5, sd=4)
79 |
80 | hist(x)
81 | ```
82 |
83 | 指令 `x = rnorm(10000, mean=5, sd=4)` 代表我們要用平均值為 5, 標準差為 4 的常態分布,隨機產生 10000 個樣本,然後將這些樣本存到 x 陣列當中。
84 |
85 | 指令 `hist(x)` 代表要用這些樣本畫出統計的直方圖 (Histogram),於是就畫出了圖中的那個長條狀圖形。
86 |
87 | 現在、請讀者試著看看下列操作,看看您是否能夠讀懂這些操作的意義。
88 |
89 | ```R
90 | rnorm(10, 3, 2)
91 | > x
92 | [1] 2.5810213 0.5399127 5.0005020 5.3402693 2.7900723 3.9638088 5.2119685
93 | [8] 2.2209882 2.9935943 7.0308419
94 | > a=dnorm(1.96)
95 | > a
96 | [1] 0.05844094
97 | > b=pnorm(1.96)
98 | > b
99 | [1] 0.9750021
100 | > c=qnorm(b)
101 | > c
102 | [1] 1.96
103 | > d=rnorm(10)
104 | > d
105 | [1] -0.32913677 0.77788306 -1.80862496 0.16694598 -0.65656254 -1.76305925
106 | [7] 1.18237502 0.19651748 -0.07898685 0.73970933
107 | >
108 | ```
109 |
110 | 在下一期當中,我們將會用 R 統計軟體,示範如何進行敘述統計的操作,並說明這些操作的意義,我們下期見!
111 |
--------------------------------------------------------------------------------
/source/article4.md:
--------------------------------------------------------------------------------
1 | ## 從 C# 看作業系統:(1) Thread 與 Deadlock 實作 -- (作者:陳鍾誠)
2 |
3 | 很多資工系的學生都上過作業系統這門課,但是通常老師只有講理論,沒有說明如何實作,這讓很多同學都無法清楚的理解其中的概念。在本系列文章中,我們將使用 C# 語言來說明作業系統當中的一些關鍵概念,像是 Process (進程、行程、Task)、Thread (執行緒、線程)、Deadlock (死結)、Race Condition (競爭情況)、Semaphore (號誌、信號量) 等等。
4 |
5 | ### Process 與 Thread
6 |
7 | Thread 在台灣被稱為『執行緒』,但是在中國被稱為『線程』,作業系統教科書中通常會定義 Process 為:執行中的程式。因此假如您開了一個 Word 檔案,那就是有一個 Word 行程在執行,如果您又開了個命令列,那就是又有一個命令列行程在執行,如果又開第二個命令列,那就有兩個命令列行程在執行。
8 |
9 | Thread 在作業系統中通常被定義為輕量級行程 (Light Weight Process),一個 Process 可以包含很多個 Thread,如下圖所示:
10 |
11 | 
12 |
13 | 每個 Process 與 Thread 都會執行,而且執行到一半很可能就會因為進行輸出入或佔用 CPU 過久而被作業系統切換出去,改換另一個 Process 或 Thread 執行,這種概念稱為 Multitasking (多工)。
14 |
15 | 在 Windows 當中,我們可以按下 Ctrl-Alt-Del 鍵以顯示出系統的行程資訊,而在 Linux 中則可以用 ps (Process Status) 這個指令顯示行程資訊,以下是這兩個作業系統中的行程資訊範例。
16 |
17 | 
18 |
19 | Thread 交替執行的這種慨念可以用下圖表示。(Proces 也是如此,只是將圖中的 Thread 改為 Process 而已)
20 |
21 | 
22 |
23 | ### C# 中的 Thread 概念
24 |
25 | 在現代的作業系統當中,如果我們將一個程式重複執行兩次,將會產生兩個 Process ,那麼這兩個程式將是毫不相關的。任何一個程式都不需要知道另一個程式是否存在,通常也不會與另一個程式進行溝通。
26 |
27 | 但是,如果我們希望兩個程式能夠互相分享某些變數,但是卻又同時執行,此時就可以利用 Thread 的機制。對於程式設計師而言,Thread 就像一個可以單獨執行的函數,這個函數與其他程式 (包含主程式) 同時執行,感覺上好像互相獨立,但是又可以共用某些變數。以下是一個 C# 的 Thread 範例:
28 |
29 | ```CS
30 | using System;
31 | using System.Threading;
32 |
33 | class SimpleThread
34 | {
35 | String name;
36 |
37 | public static void Main(String[] args)
38 | {
39 | SimpleThread a = new SimpleThread("A");
40 | SimpleThread b = new SimpleThread("B");
41 | Thread athread = new Thread(a.run);
42 | Thread bthread = new Thread(b.run);
43 | athread.Start();
44 | bthread.Start();
45 | athread.Join();
46 | bthread.Join();
47 | }
48 |
49 | SimpleThread(String pName)
50 | {
51 | name = pName;
52 | }
53 |
54 | public void run()
55 | {
56 | for (int i = 0; i < 10; i++)
57 | {
58 | String line = name + ":" + i;
59 | Console.WriteLine(line);
60 | // Thread.Sleep(10);
61 | }
62 | }
63 | }
64 | ```
65 |
66 | 其執行結果如下圖所示:
67 |
68 | 
69 |
70 | 對於剛開始接觸 Thread 的程式人員而言,會感覺到相當的詭異。因為『兩個 Thread 同時執行』是一個相當難以理解的概念。事實上,對於只有一個 CPU 的程式而言,並非兩個程式真的會「同時」執行,而只不過是「交錯」執行而已。但是這個交錯方式是由作業系統決定的,而非由程式設計師自行安排。而對於多 CPU 或多核心的處理器而言,就真的會「同時」執行,而不是只有「交錯」執行而已。
71 |
72 | 通常,程式人員對於這種不能由自己操控決定的情況會有不安的感覺,但是當您多寫幾個程式之後,這種疑慮就會消除了,畢竟,程式人員本來就相當依賴作業系統,只是自己通常感覺不到而已。
73 |
74 | 當然,如果我們想要稍微控制一下 Thread 的執行順序,那麼就可以要求目前的 Thread 去休息睡覺,像是上述程式中的 Thread.Sleep(10) 這行程是本來是被註解掉的,但是如果我們將這行程式的註解拿掉,那麼將得到下列執行結果。
75 |
76 | 
77 |
78 | 從上面兩個圖中,您可以看到還沒加入 Thread.Sleep(10) 之前,兩個 Thread 的交錯方是很隨興,基本上是由作業系統任意安排的,但是在加入 Thread.Sleep(10) 之後,因為兩個 Thread 在印一次後就會禮讓給對方,所以就成了嚴格交互的 A, B, A, B .... 之情形了。
79 |
80 | ### 以 C# 體驗 Deadlock 死結
81 |
82 | 在作業系統的課程當中我們會學到『死結』這個問題,當程式 1 抓住資源 A,卻又在等程式 2 釋放資源 B,而程式 2 則抓住資源 B ,卻又在等程式 1 釋放資源 A 的時候,就會進入死結狀態。這就像兩台很長的火車,互相卡住對方一般,下圖顯示了死結情況的示意圖。
83 |
84 | 
85 |
86 | 在程式設計中我們真的會遇到死結嗎?如果真的有死結,能否寫一個會造成死結的程式呢?
87 |
88 | 這並不難,只要用執行緒 (Thread) 與鎖定 (lock) 機制,我們很容易就可以造出會導致死結的程式,以下是我們用 C# 撰寫的一段死結程式,請參考。
89 |
90 | ```CS
91 | using System;
92 | using System.Threading;
93 | using System.Text;
94 |
95 | class ThreadTest
96 | {
97 | static String A = "A";
98 | static String B = "B";
99 |
100 | public static void Main(String[] args)
101 | {
102 | Thread thread1 = new Thread(AB);
103 | Thread thread2 = new Thread(BA);
104 | thread1.Start();
105 | thread2.Start();
106 | thread1.Join();
107 | thread2.Join();
108 | }
109 |
110 | public static void AB()
111 | {
112 | lock (A)
113 | {
114 | Console.WriteLine("AB.lock(A)");
115 | Thread.Sleep(1000);
116 | lock (B)
117 | {
118 | Console.WriteLine("AB.lock(B)");
119 | }
120 | }
121 | }
122 |
123 | public static void BA()
124 | {
125 | lock (B)
126 | {
127 | Console.WriteLine("BA.lock(B)");
128 | Thread.Sleep(1000);
129 | lock (A)
130 | {
131 | Console.WriteLine("BA.lock(A)");
132 | }
133 | }
134 | }
135 | }
136 | ```
137 |
138 | 上述程式的執行結果如下圖所示,當程式跑到 BA.lock(B) 之後就進入了死結,再也無法跑下去了,因此我們不會看到 BA.lock(A) 與 AB.lock(B) 這兩行輸出的結果,程式已經進入了死結狀態,再也出不來了。
139 |
140 | 
141 |
142 | 至此,我們已經用 C# 實作了作業系統中的 Thread 與 Deadlock 這兩種慨念,以便讓讀者能透過實作真正的去感受作業系統,希望這樣的說明方式對讀者會有所幫助。
143 |
144 | 在下一期當中,我們將繼續利用 C# 說明作業系統中的 Race Condition (競爭情況) 概念與利用 lock 及 Semaphore 機制避免 Race Condition 的方法,我們下期見!
145 |
146 |
147 |
148 |
--------------------------------------------------------------------------------
/source/build.bat:
--------------------------------------------------------------------------------
1 | pandoc -s -S -c ../css/pmag.css -B ../htm/header.htm -A ../htm/footer.htm ../md/home.md -o ../htm/home.htm
2 | pandoc -s -S -c ../css/pmag.css -B ../htm/header.htm -A ../htm/footer.htm ../md/preface.md -o ../htm/preface.htm
3 | pandoc -s -S -c ../css/pmag.css -B ../htm/header.htm -A ../htm/footer.htm ../md/message1.md -o ../htm/message1.htm
4 | pandoc -s -S -c ../css/pmag.css -B ../htm/header.htm -A ../htm/footer.htm ../md/message2.md -o ../htm/message2.htm
5 | pandoc -s -S -c ../css/pmag.css -B ../htm/header.htm -A ../htm/footer.htm ../md/message3.md -o ../htm/message3.htm
6 | pandoc -s -S -c ../css/pmag.css -B ../htm/header.htm -A ../htm/footer.htm ../md/people1.md -o ../htm/people1.htm
7 | pandoc -s -S -c ../css/pmag.css -B ../htm/header.htm -A ../htm/footer.htm ../md/people2.md -o ../htm/people2.htm
8 | pandoc -s -S -c ../css/pmag.css -B ../htm/header.htm -A ../htm/footer.htm ../md/video1.md -o ../htm/video1.htm
9 | pandoc -s -S -c ../css/pmag.css -B ../htm/header.htm -A ../htm/footer.htm ../md/info.md -o ../htm/info.htm
10 | pandoc -s -S ../md/home.md -o ../odt/home.odt
11 |
--------------------------------------------------------------------------------
/source/footer.htm:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/source/head.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/source/head.md
--------------------------------------------------------------------------------
/source/home.md:
--------------------------------------------------------------------------------
1 | ### 關於程式人雜誌
2 | 程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌。
3 |
4 | ### 雜誌下載
5 |
6 | 出刊年月 epub ipad:PDF A4:PDF 單頁 HTM 原始碼 全部下載
7 | ------------ ---------- ----------- -------- ----------- ---------- -------------
8 | 2013年3月 [epub] [ipad.pdf] [A4.pdf] [pmag.html] [code.zip] [201303.zip]
9 |
10 | ### 本期內容
11 | * [授權聲明](license.html)
12 | * 程式人短訊
13 | * [法律短訊-創作共用授權間的相容性問題與疑惑](message1.html)
14 | * [書籍短訊:電腦類的免費電子書網站](message2.html)
15 | * [網路短訊-MOOC 大量線上教育](message3.html)
16 | * 程式人介紹
17 | * [開放原始碼之父–Richard Stallman](people1.html)
18 | * [LLVM編譯器基礎架構的靈魂人物-Chris Lattner](people2.html)
19 | * 程式人頻道
20 | * [看影片學 C# 視窗程式設計](video1.html)
21 | * 程式人文集
22 | * [Arduino入門教學:(3) LED 控制實驗 - (作者:Copper Maa)](article1.html)
23 | * [JavaScript:(3) Closure 與匿名函數 - (作者:陳鍾誠)](article2.html)
24 | * [R 統計軟體:(1) 簡介與基本操作 – (作者:陳鍾誠)](article3.html)
25 | * [從 C# 看作業系統:(1) Thread 與 Deadlock 實作 – (作者:陳鍾誠)](article4.html)
26 | * [雜誌訊息](info.html)
27 |
28 | ### 雜誌訂閱
29 | 想訂閱程式人雜誌請按 [雜誌訂閱] 連結並填寫表單。
30 |
31 | ### 連絡我們
32 | 竭誠歡迎程式人投稿,或者成為本雜誌的專欄作家,現在就可以加入 [程式人雜誌社團] 一同共襄盛舉。
33 |
34 | 本雜誌編輯為「陳鍾誠 (@ccckmit)」,若要聯絡編輯,請寄信到 。
35 |
36 | [epub]: ../book/pmag201303A4.epub
37 | [ipad.pdf]: ../book/pmag201303ipad.pdf
38 | [A4.pdf]: ../book/pmag201303A4.pdf
39 | [code.zip]: ../code.zip
40 | [pmag.html]: ../book/pmag201303.html
41 | [201303.zip]: ../../201303.zip
42 |
--------------------------------------------------------------------------------
/source/info.md:
--------------------------------------------------------------------------------
1 | # 雜誌訊息
2 |
3 | ## 讀者訂閱
4 | 程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌,如果您願意成為本雜誌的專欄作家,請加入 [程式人雜誌社團] 一同共襄盛舉。
5 |
6 | 我們透過發行這本雜誌,希望讓大家可以讀到想讀的書,學到想學的技術,同時也讓寫作的朋友的作品能產生良好價值 – 那就是讓讀者根據雜誌的價值捐款給慈善團體。
7 | 讀雜誌做公益也不需要有壓力,您不需要每讀一本就急著去捐款,您可以讀了十本再捐,或者使用固定的月捐款方式,當成是雜誌訂閱費,或者是季捐款、一年捐一次等都 OK ! 甚至是單純當個讀者我們也都很歡迎!
8 | 本雜誌每期參考價:NT 50 元,如果您喜歡本雜誌,請將書款捐贈公益團體。例如可捐贈給「羅慧夫顱顏基金會 彰化銀行(009) 帳號:5234-01-41778-800」。(若匯款要加註可用「程式人雜誌」五個字)
9 |
10 | 想訂閱本雜誌的讀者,請按 [雜誌訂閱] 連結並填寫表單,我們會在每一期雜誌出刊時寄送通知與下載網址到您的信箱。
11 |
12 | ## 投稿須知
13 |
14 | *給專欄寫作者:* 做公益不需要有壓力。如果您願意撰寫專欄,您可以輕鬆的寫,如果當月的稿件出不來,我們會安排其他稿件上場。
15 |
16 | *給網誌捐贈者:* 如果您沒時間寫專欄或投稿,沒關係,只要將您的網誌以 [創作共用的「姓名標示、非商業性、相同方式分享」授權] 並通知我們,我們會自動從中選取需要的文章進行編輯,放入適當的雜誌當中出刊。
17 |
18 | *給文章投稿者:* 程式人雜誌非常歡迎您加入作者的行列,如果您想撰寫任何文章或投稿,請用 markdown 或 LibreOffice 編輯好您的稿件,並於每個月 25 日前投稿到[程式人雜誌社團] 的檔案區,我們會盡可能將稿件編入隔月1號出版程式人雜誌當中,也歡迎您到社團中與我們一同討論。
19 |
20 | 如果您要投稿給程式人雜誌,請盡可能使用以下兩種方式:
21 |
22 | 1. 使用 markdown 格式:markdown 的撰寫格式請參考 [markdown樣版](../template/template.md)
23 | 2. 使用 LibreOffice odt 格式:odt 格式請下載 [odt樣版](../template/template.odt)。
24 |
25 | 關於以上兩種格式的寫法請下載 [template.zip](../template.zip) 以便瞭解寫作的方式與細節,請下載後閱讀 submit.md 檔案。
26 |
27 | 我們目前的編輯流程是用 pandoc 軟體將 markdown 轉換成 htm 與 epub 檔,然後再用 calibre 軟體中的 ebook-conver 指令將 epub 轉換為 pdf 與 mobi 檔案,如此就可以得到 htm, epub, pdf, mobi 等四種版本,而針對 pdf 檔我們還進一步區分為 A4 版與 ipad 版,以方便讀者根據需求自行取用。
28 |
29 | ## 參與編輯
30 | 您也可以擔任程式人雜誌的編輯,甚至創造一個全新的公益雜誌,我們誠摯的邀請您加入「開放公益出版」的行列,如果您想擔任編輯或創造新雜誌,也歡迎到 [程式人雜誌社團] 來與我們討論相關事宜。
31 |
32 | ## 公益資訊
33 |
34 | ------------------------------------------------------------------------------------------------------------------------------------------------------------
35 | 公益團體 聯絡資訊 服務對象 捐款帳號
36 | ------------------------------- ----------------------------- ----------------------------------------- -------------------------------------------
37 | 財團法人羅慧夫顱顏基金會 顱顏患者 銀行:009彰化銀行民生分行
38 | (如唇顎裂、小耳症或其他罕見顱顏缺陷) 帳號:5234-01-41778-800
39 | 02-27190408分機 232
40 |
41 | 社團法人台灣省兒童少年成長協會 單親、隔代教養.弱勢及一般家庭之兒童青少年 銀行:新光銀行
42 | 戶名:台灣省兒童少年成長協會
43 | 04-23058005 帳號:103-0912-10-000212-0
44 | ------------------------------- ----------------------------- ----------------------------------------- -------------------------------------------
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/source/license.md:
--------------------------------------------------------------------------------
1 |
2 | ## 授權聲明
3 |
4 | 本雜誌採用 創作共用:[姓名標示、相同方式分享] 授權,若您想要修改本書產生衍生著作時,至少應該遵守下列授權條件:
5 |
6 | 1. 標示原作者姓名
7 | 3. 採用 創作共用:[姓名標示、相同方式分享] 的方式公開衍生著作。
8 |
9 | 另外、當本雜誌中有文章或素材並非採用 [姓名標示、相同方式分享] 時,將會在該文章或素材後面標示其授權,此時該文章將以該標示的方式授權釋出,請修改者注意這些授權標示,以避免產生侵權糾紛。
10 |
11 | 例如有些文章可能不希望被作為「商業性使用」,此時就可能會採用創作共用:[姓名標示、非商業性、相同方式分享] 的授權,此時您就不應當將該文章用於商業用途上。
12 |
13 | 最後、懇請勿移除公益捐贈的相關描述,以便讓愛心得以持續散播!
14 |
--------------------------------------------------------------------------------
/source/message.md:
--------------------------------------------------------------------------------
1 |
2 | # 程式人短訊
3 |
--------------------------------------------------------------------------------
/source/message1.md:
--------------------------------------------------------------------------------
1 | ## 法律短訊-創作共用授權間的相容性問題與疑惑
2 |
3 | ### 相容性問題
4 |
5 | 在前幾期的程式人雜誌中,我們都有引用並修改了維基百科的文章,然後採用 [姓名標示、非商業性、相同方式分享] 的 CC 授權方式分享整本雜誌,後來我收到 jserv 兄的 email 之後,才知道原來維基百科是採用 [姓名標示、相同方式分享] 的授權,而且更慘的是,這兩個授權互不相容,不能修改後以另一個授權釋出。
6 |
7 | 在 [Remixing OER: A Guide to License Compatibility] 這篇文章中,Creative Commons 組織說明了 CC 授權的相容性,並且畫出了一個相容矩陣,如下圖所示。
8 |
9 | 
10 |
11 | 其中 BY-NC-SA 就是 [姓名標示、非商業性、相同方式分享] 授權,而 BY-SA 就是 [姓名標示、相同方式分享] 授權,而文章中對 BY-SA 授權的說明如下。
12 |
13 | > This license lets others copy, share, modify and build upon your work even for commercial purposes, as long as they credit you and license new creations derived from your work under the same conditions.
14 |
15 | 由這段文字看來,SA (Share-Alike) 屬性的授權就必須用同樣授權進行分享,因此就不能將 BY-SA 改為 BY-NC-SA 授權分享了,雖然 BY-NC-SA 的分享條件事實上比 BY-SA 更嚴格。
16 |
17 | ### 前幾期授權錯誤的更正方式
18 |
19 | 由於 BY-SA 與 BY-NC-SA 兩者完全不能相容,因此本雜誌前兩期的做法,有些文章乃是修改自維基百科,然後整本雜誌標示 [姓名標示、非商業性、相同方式分享] 的方式就有錯誤了,因此筆者會將前兩期有修正自維基百科的文章改標示為 [姓名標示、相同方式分享] 授權,以更正此一錯誤。
20 |
21 | 這種方式我們目前認為應該可以符合 BY-SA 的授權規定,因為 BY-SA 的授權當中有下列描述:
22 |
23 | > 「彙編」指文學或藝術創作的合集,例如百科全書及詩文選集,表演、錄音物或廣播,或除列舉於後述第1條第(h)項所列之著作以外的其他著作或保護標的。由於其內容之選擇與編排具有智慧創作性,且本著作於其中是以未經修改的完整形式,與一個或更多的作品,彼此間成為分離且獨立之著作,而共同彙集成的完整合集。為本授權條款之目的,構成彙編的著作,不會被視為改用作品(定義如上)。
24 |
25 | 而本雜誌基本上是一堆文章的彙編,因此我們將藉由此一方式修正前兩期的授權錯誤!
26 |
27 | 本期開始,「程式人雜誌」將採用與維基百科相容的 [姓名標示、相同方式分享] 授權,然後請投稿者盡可能用此一授權進行投稿,如果投稿者仍然覺得「非商業性」是必要條件的話,那我們將在該篇文章中單獨標示授權,以便盡可能的符合維基百科的授權規定。
28 |
29 | ### 筆者的疑惑
30 |
31 | 不過,筆者百思不解的一個問題是,為何 Lawrence Lessig 要用 Share-Alike 這個條件,將相容性鎖死,而不改用像 Share-Publicly (公開分享, SP) 這樣的條件呢?因為如果用 SP 取代 SA 的話,整個授權矩陣不就可以變成如下形式,授權間的相容性就會提高不少了阿!
32 |
33 | 原作\改作 BY BY-NC BY-NC-ND BY-NC-SP BY-ND BY-SP
34 | ----------- ------- --------- --------- --------- ------- -------
35 | BY ○ ○ ○ ○ ○ ○
36 | BY-NC ○ ○ ○
37 | BY-NC-ND
38 | BY-NC-SP ○ ○
39 | BY-ND
40 | BY-SP ○ ○ ○ ○
41 |
42 | 由於筆者並非法律專家,也很難對「著作權法」目前的「合理使用」之範圍有明確的判斷力,但我們非常努力的想遵守「著作權法」與「創作共用」的規定,如果本雜誌在授權上仍有侵權問題的話,請來信告知,我們會盡可能符合法律規定。
43 |
44 | 另外、筆者希望知道這個問題答案的人,可以來信或留言告知上述問題的答案,以解筆者之惑阿!【本文由陳鍾誠撰寫】
45 |
46 | [Remixing OER: A Guide to License Compatibility]:http://learn.creativecommons.org/wp-content/uploads/2009/10/cclearn-explanations-cc-license-compatability.pdf
47 |
--------------------------------------------------------------------------------
/source/message2.md:
--------------------------------------------------------------------------------
1 | ## 書籍短訊:電腦類的免費電子書網站
2 |
3 | FreeComputerBooks 是筆者很常用來下載免費電子書的網站,這個網站其實是一個資訊類電子書的入口網站,經營者把他所找得到的資訊類電子書連結都蒐集在此,以下是該網站的網址。
4 |
5 | *
6 |
7 | 以下是該網站的入口畫面,網站中包含了很詳細的分類,如果您需要合法的免費電腦書籍,可以考慮從
8 |
9 | 
10 |
11 | 另外、Freetechbooks 也是一個同性質的網站,網址如下:
12 |
13 | *
14 |
15 | 有了這兩個網站,相信程式人會很容易的找到您要的英文免費電子書。(不過可惜的是、中文的世界筆者還沒看到類似的入口網站,如果有讀者知道請記得告訴我!)【本文由陳鍾誠撰寫】
16 |
17 |
--------------------------------------------------------------------------------
/source/message3.md:
--------------------------------------------------------------------------------
1 | ## 網路短訊-MOOC 大量線上教育
2 |
3 | 最近 MOOC (Massive Open Online Course) 突然變成了一個熱門名詞,翻譯成中文就是 (大規模開放線上課程)。數位時代雜誌與商業週刊都不約而同用這個主題當作封面故事,可見這個名詞的火紅程度真的很高。
4 |
5 | 2002 年 MIT 提出 Open Course Ware (OCW) 開放課程之後,很多學校都跟進採用 OCW 的方式釋出教材。在台灣、交通大學大概是最早採用 OCW 的學校,後來台大等許多學校也陸續跟進了,以下是台灣 OCW 的相關網址。
6 |
7 | 學校 OCW 網址
8 | ------- ------------------------------
9 | 交通大學
10 | 台灣大學
11 | 清華大學
12 | 中山大學
13 | 臺灣師範大學
14 | 政治大學
15 | 輔仁大學
16 | 南台科技大學
17 |
18 | OCW 的特色是把學校老師的教材上傳,這些教材通常包含「講義、投影片、授課錄影、指定作業」等等,這種由學校主動要求老師將教材有系統性上傳做法在當年也算是一大進步,讓很多人受惠良多 (包含我在內)。
19 |
20 | 但是如果您看過這些課程,可能會發現自己很難從頭到尾看完,因為要把一門課從頭到尾看完,可能得每次看好幾個小時,然後看個十幾二十次,這對於網路世代講求速效的人們而言,真的很不容易。
21 |
22 | MOOC 可以說是在 OCW 的基礎上更進了一步,主要特色是必須在網路上登錄註冊才可以開始上課,課程內容、編排與呈現方法都與 OCW 有所差別,教師不再是將上課從頭到尾進行錄影下來,而是專門針的一個主題,進行 10 分鐘左右的講解,然後會隨即附上一兩個作業或測驗,讓學員能夠透過該作業檢驗該主題是否已經學會了。由於需要登入才能上課,因此這些作業都可以直接在網路上作答。
23 |
24 | 
25 |
26 | 如果你寫不出作業,想找同學討論,沒關係,課程上都附有討論區,讓同一門課的學員可以互相討論,充分理解之後再進行作答也可以。
27 |
28 | 那麼、這些作業與測驗由誰來批改呢?如果是選擇題的話,當然就可以由電腦直接批改沒有問題,但是如果是問答、數學證明或程式設計題的話,這些線上課程動不動就有五萬人同時登入上課,那麼老師一個人要改五萬份考卷不是改到手斷掉,於是有些 MOOC 平台會要求學員每個人要負責改隨機選出的 3-5 人作業,這樣老師的手就不會斷掉了 (但是學生的手會很痠!)。
29 |
30 | 當然、在這樣的機制上,作弊也是有可能的,但是這些課程登入時都會要求你按下誠實條款。畢竟、不誠則無物 (這不知道是哪個偉人所說的,我也忘了!)
31 |
32 | 
33 |
34 | MOOC 就是將這種「教學短片 => 作業測驗 => 討論作答」的方式,整合成一個網站,所有的學習都在這個網站上完成,這可以說是一種新型的教育模式,或許不久之後台灣也會有學校開始嘗試這種做法也說不定。
35 |
36 | 目前筆者所知道的 MOOC 平台網站有三個,分別是 Coursera, Udacity, edX,網址如下所示。
37 |
38 | MOOC 平台 網址
39 | ----------- ------------------------------
40 | Coursera
41 | Udacity
42 | edX
43 |
44 | 這些網站的背後,其實也都有相對應的學校在支援,而且最近開始也吸引了不少資金的投入,或許真的會形成一股教育新勢力也說不定。
45 |
46 | 更棒的是,當您修完課之後,只要付一些證書的費用 (通常一兩百美金),就可以取得證明書。當然、您得先通過這些測驗,至少要及格才行。
47 |
48 | 以下就是筆者慘痛的經驗,上去註冊之後每天都曠課,測驗完全沒有做,因此筆者在 MIT 的電子學課程上,竟然以零分的成績,被死當了,有圖為證:
49 |
50 | 
51 |
52 | 雖然說這些證明書目前在台灣還沒有甚麼法律效用,不能拿來當作大學畢業證書,但是能拿到一張「MIT、史丹佛」等名校的某某課程證書,真的是酷炫到不行。這樣、不用出國也能到名校留學了!【本文由陳鍾誠撰寫】
53 |
54 |
--------------------------------------------------------------------------------
/source/message4.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/source/message4.md
--------------------------------------------------------------------------------
/source/metadata.xml:
--------------------------------------------------------------------------------
1 | Creative Commons Non-Commercial Share Alike 3.0
2 | en-US
3 |
--------------------------------------------------------------------------------
/source/pdffooter.htm:
--------------------------------------------------------------------------------
1 | _PAGENUM_
2 |
--------------------------------------------------------------------------------
/source/people.md:
--------------------------------------------------------------------------------
1 | # 程式人介紹
2 |
--------------------------------------------------------------------------------
/source/people1.md:
--------------------------------------------------------------------------------
1 | ## 開放原始碼之父–Richard Stallman
2 |
3 | Richard Stallman 是開放原始碼領域最知名的人物之一,也是創造整個開源文化的始祖,他於 1983 年創建了 GNU 計畫,想建立一個類似 UNIX 的作業系統,雖然這個作業系統卻遲遲未能完成,但是 GNU 卻創造出了完成這個作業系統的大部分工具,像是 gcc, gdb, glibc, Emacs 等等,這讓後來的 (Linus Torvalds) 能夠在此基礎上創造出 Linux。
4 |
5 | 
6 |
7 | 另外、Stallman 也創造出 GPL (GNU General Public License) 這個重要的開放原始碼授權,並且找了律師一起制定相關的法律條款,位開放原始碼的發展奠定了法律基礎。2001 年時,Lawrence Lessig 也是受到這類授權的啟發而創造出了 Creative Commons 創作共用授權,讓開放原始碼文化擴散到一般領域。
8 |
9 | 根據 Stallman 的傳記,他是因為想要改良一台 Xerox 9700 的雷射印表機的功能,槓上了全錄公司,由於該印表機沒有附上驅動程式的原始碼,並且拒絕 Stallman 等人的索取程式碼,所以才引發了他推展開放原始碼運動的想法。
10 |
11 | 這個故事告訴我們,有時候毫不起眼的小事,會改變你的一生,然後讓你變成偉人!
12 |
13 | 【本文由陳鍾誠取材並修改自維基百科】
14 |
15 |
16 |
--------------------------------------------------------------------------------
/source/people2.md:
--------------------------------------------------------------------------------
1 | ## LLVM編譯器基礎架構的靈魂人物-Chris Lattner
2 |
3 | 前一篇文章中,我們介紹了開放原始碼之父 Richard Stallman ,他所創造的 GNU 組織,設計出了 gcc 的整套編譯器與工具鏈,對開放原始碼世界造成非常深遠的影響。現在、我們將介紹 Apple 所採用新一代編譯器 LLVM 的重要靈魂人物:Chris Lattner。
4 |
5 | 2000年,Chris Lattner 自奧勒岡州波特蘭大學(University of Portland)計算機科學系畢業後,進入伊利諾伊大學厄巴納-香檳分校 (University of Illinois at Urbana-Champaign ) 就讀。在此期間,他與維克拉姆·艾夫(Vikram Adve)發起 LLVM 專案,並於2003年發表。
6 |
7 | LLVM 的全名是 Low Level Virtual Machine,因為 LLVM 的設計的初始目標是為所有靜態及動態語言創造出動態的編譯技術,但後來 LLVM 不斷的擴大之後,專案範圍已經不再侷限於虛擬機,成為以編譯器為核心的一個基礎架構,包含編譯、連結、除錯等等相關工具,其原始碼採用 BSD 的授權協定。
8 |
9 | 現在 LLVM 已經單純成為一個縮寫標記,適用於 LLVM 底下的所有專案,包含 LLVM 中介碼(LLVM IR)、LLDB 除錯工具、LLVM C++ 標準函式庫等等。
10 |
11 | 2005年,蘋果公司僱用了 Chris Lattner 及他的團隊,目的是將 LLVM 帶入蘋果公司,創立編譯器團隊並改進蘋果系統的速度與品質,並且同時啟動了 Clang 這個子計畫,負責改進蘋果系統的主要開發語言 Objective-C (同時支援 C/C++)、將 LLVM 納入到蘋果開發工具 Xcode 中,並且開始孕育並培養 LLVM 的開放原始碼社群。
12 |
13 | 2010 年,ACM 組織的 SIGPLAN 團體頒贈了「程式語言軟體獎」(Programming Languages Software Award) 給 Chris Lattner,以表彰他在 LLVM 上的貢獻,
14 |
15 | LLVM 目前支援 Ada、C、C++、D、Fortran 及 Objective-C 等語言,也有人寫了 Haskell 的 LLVM 編譯器。現在、LLVM 已經成為 GNU 編譯器工具鏈 gcc 的一個競爭方案。而且、由於 gcc 已經是個歷史悠久的專案了,相對的很多程式碼也會比較陳舊而難以維護,因此 LLVM 或許能取代 gcc 而成為未來開放原始碼領域的主要編譯工具也說不定,因為 LLVM 的架構感覺上比 gcc 更清楚,更容易維護。
16 |
17 | LLVM 編譯器基本上屬於彈性的三層式編譯器架構,基本上可分為 Frontend (前端)、IR 與最佳化、Backend (後端) 等幾部分,這種方式可以有效的將「高階語言」與「目標語言」兩者分離開來,形成一個多對多的架構,會比較容易就可以加入新的高階語言,或者產生新的目標語言,此種架構如下圖所示。
18 |
19 | 
20 |
21 | 在編譯器領域,已經有不少人開始高度注意 LLVM 這個專案,並且實際在各個領域,您可以在 當中找到 LLVM 的相關技術資訊。
22 |
23 | 特別值得一提的是,筆者正在進行的「開放電腦計畫」這個企圖自行建立 「CPU、Assembler、Compiler、OS、虛擬機」的計畫中,原本進度稍嫌緩慢,但是在我大哥決定為此計畫的處理器 CPU0 寫一個 LLVM Backend 程式,並寫出了 [Tutorial: Creating an LLVM Backend for the Cpu0 Architecture] 這本書籍之後,就往前邁進了很多。有了 LLVM Backend 的技術,就讓我們有機會可以用標準的 C 語言將現成的小型作業系統,像是 UNIXv6、MINIX 或 RTThread 等作業系統,移植到 CPU0 上,以便完成整個計畫了。
24 |
25 | ### 參考文獻
26 | * Chris Lattner's Homepage --
27 | * Chris Lattner --
28 | * LLVM 2.0 --
29 | * Mac OS X 背后的故事(八)三好学生Chris Lattner的LLVM编译工具链 --
30 | *
31 | *
32 | * LLVM, Chris Lattner --
33 |
34 | [Tutorial: Creating an LLVM Backend for the Cpu0 Architecture]:http://jonathan2251.github.com/lbd/
35 |
36 | 【本文由陳鍾誠取材並修改自維基百科】
37 |
38 |
--------------------------------------------------------------------------------
/source/reflink.md:
--------------------------------------------------------------------------------
1 | [程式人雜誌社團]: https://www.facebook.com/groups/programmerMagazine/
2 | [姓名標示、相同方式分享]: http://creativecommons.org/licenses/by-sa/3.0/tw/
3 | [姓名標示、非商業性、相同方式分享]: http://creativecommons.org/licenses/by-nc-sa/3.0/tw/
4 | [馬萬圳]: http://coopermaa2nd.blogspot.tw/
5 | [陳鍾誠]: http://ccckmit.wikidot.com/
6 | [雜誌訂閱]: https://docs.google.com/spreadsheet/viewform?fromEmail=true&formkey=dG1TcER6Q3h1ZkpacFpDeEVFTDBLeVE6MQ
7 |
--------------------------------------------------------------------------------
/source/toc.md:
--------------------------------------------------------------------------------
1 | % 程式人雜誌
2 | % 開放公益出版品
3 | % 2013 年 3 月號
4 |
5 | # 本期內容
6 |
7 | * [程式人短訊](ch2.xhtml)
8 | * [法律短訊-創作共用授權間的相容性問題與疑惑](ch2.xhtml#法律短訊-創作共用授權間的相容性問題與疑惑)
9 | * [書籍短訊:電腦類的免費電子書網站](ch2.xhtml#書籍短訊電腦類的免費電子書網站)
10 | * [網路短訊-MOOC 大量線上教育](ch2.xhtml#網路短訊-mooc-大量線上教育)
11 | * [程式人介紹](ch3.xhtml)
12 | * [開放原始碼之父–Richard Stallman](ch3.xhtml#開放原始碼之父richard-stallman)
13 | * [LLVM編譯器基礎架構的靈魂人物-Chris Lattner](ch3.xhtml#llvm編譯器基礎架構的靈魂人物-chris-lattner)
14 | * [程式人頻道](ch4.xhtml)
15 | * [看影片學 C# 視窗程式設計](ch4.xhtml#看影片學-c-視窗程式設計)
16 | * [程式人文集](ch5.xhtml)
17 | * [Arduino入門教學(3) – LED 控制實驗 (作者:Copper Maa)](ch5.xhtml#arduino入門教學3-led-控制實驗-作者copper-maa)
18 | * [JavaScript (3) – Closure 與匿名函數 (作者:陳鍾誠)](ch5.xhtml#javascript-3-closure-與匿名函數-作者陳鍾誠)
19 | * [R 統計軟體:(1) 簡介與基本操作 – (作者:陳鍾誠)](ch5.xhtml#r-統計軟體1-簡介與基本操作-作者陳鍾誠)
20 | * [從 C# 看作業系統:(1) Thread 與 Deadlock 實作 – (作者:陳鍾誠)](ch5.xhtml#從-c-看作業系統1-thread-與-deadlock-實作-作者陳鍾誠)
21 | * [雜誌訊息](ch6.xhtml)
22 | * [讀者訂閱](ch6.xhtml#讀者訂閱)
23 | * [投稿須知](ch6.xhtml#投稿須知)
24 | * [參與編輯](ch6.xhtml#參與編輯)
25 | * [公益資訊](ch6.xhtml#公益資訊)
26 |
27 |
--------------------------------------------------------------------------------
/source/video.md:
--------------------------------------------------------------------------------
1 | # 程式人頻道
2 |
--------------------------------------------------------------------------------
/source/video1.md:
--------------------------------------------------------------------------------
1 | ## 看影片學 C# 視窗程式設計
2 |
3 | C# 是微軟平台的主力語言,用來寫 Windows 系統的程式非常好用,也是很多學生學習視窗程式設計的捷徑。
4 |
5 | 但是在學習視窗程式設計的時候,只看書往往會覺得有點學習障礙,這是因為 C# 的開發工具 Visual Studio 實在設計得太好的關係。
6 |
7 | Visual Studio 我們可以用視覺化拖拉的方式,輕易的進行視窗界面設計,這些拖拉動作所產生的界面程式碼數量很多,我們通常很難直接用打字的方式設計,於是 C# 的視窗程式就和 Visual Studio 這個開發工具緊密的結合在一起了。
8 |
9 | 傳統的紙本書籍很難傳達這種視覺化界面操作的訊息,於是很多人買了一堆 C# 視窗程式設計書籍後,還是沒有辦法學會視窗程式。
10 |
11 | 針對這個問題,筆者的建議是利用書籍搭配教學影片一起學習,這樣既能傳達與程式相關的文字訊息,又能傳達與視覺化操作的影音訊息,兩者適當的搭配就能比較有效率的學會視窗程式設計了。
12 |
13 | 筆者自己在金門大學中教授視窗程式設計也有數年了,為了讓學生學會這個領域,我用自己熟悉的 wikidot 創建了一個針對 C# 而設計的網站,網址是 ,如果您想學習 C# 視窗程式,建議您可以從這裡開始出發。
14 |
15 | 在網站中,我們從基本的 C# 語法開始介紹、然後進入物件導向、接著才進入函式庫、檔案與 Windows Form 視窗程式,對於這些主題,筆者幾乎都會將自己上課的內容進行全程錄影,初學者如果能從頭開始閱讀這些文章並觀賞影片,應該可以很容易的進入 C# 視窗程式的領域才對。
16 |
17 | ## C# 基礎程式設計
18 |
19 | 主題 教學影片
20 | -------------------------------------------- -----------------------------------
21 | C# 命令列編譯器 csc
22 | C# Visual Studio Express 安裝與第一個程式
23 | C# 基本型態宣告與觀察
24 | C# 的基本運算操作
25 | C# 運算式家庭作業
26 | C# 的 if 語法
27 | C# 陣列與迴圈
28 | C# 迴圈 for, while 詳細講解
29 | C# 的函數呼叫
30 | C# 的物件導向/封裝
31 | C# 的物件導向/建構函數
32 | C# 的物件導向/繼承 1
33 | C# 的物件導向/繼承 2
34 | C# 的物件導向/多型
35 | C# 物件導向練習題講解
36 | C# 的錯誤處理
37 |
38 | ## C# 視窗程式設計 -- 使用 Windows Form 技術
39 |
40 | 主題 教學影片
41 | -------------------------------------------- ------------------------------------
42 | C# 文字型計算機
43 | C# 實作字典查詢程式
44 | C# Array 與 List 物件的使用
45 | C# HashTable 與 Dictionary 物件的使用
46 | C# 將小字典擴充為小翻譯系統
47 | C# Timer 與碼錶
48 | C# Timer 與小時鐘
49 | C# Timer 與移動球
50 | C# 檔案處理
51 | C# 文字編輯器 1
52 | C# 文字編輯器 2
53 | C# 畫圖功能示範
54 | C# 小畫板 (2)
55 | C# 小畫板 (3)
56 | C# 瀏覽器控制 1/3
57 | C# 瀏覽器控制 2/3
58 | C# 瀏覽器控制 3/3
59 | C# DataGridView 元件的使用
60 | C# 製作賣紅茶的 POS 系統
61 |
62 | 對於已經熟悉微軟程式設計的人而言,可能會發現我們使用的是較舊的 Windows Form 視窗架構,而非較新的 WPF (Windows Presentation Foundation) 架構,因為筆者並沒有採用 WPF 進行課堂教學的關係,不過還好,「曹祖聖」先生已經為微軟錄製了一系列的 WPF 的影音開發教材,如果您有興趣,可以到以下網頁中觀賞學習。(由於該網頁的影音採用微軟的 Silverlight,因此您必須先安裝 Silverlight 虛擬機後才能觀賞這些影片)
63 |
64 | 主題 影片網址
65 | --------------------------- ---------------------------------------------
66 | MSDN 教學短片 - WPF
67 |
68 | ## C# 網路程式設計 -- 使用 Socket 函式庫
69 |
70 | 主題 教學影片
71 | -------------------------------------------- ------------------------------------
72 | C# 網路 UDP 程式設計
73 | C# 設計簡易的 WebServer
74 | C# 多人聊天室
75 | C# 網路爬蟲 (Crawler)
76 |
77 |
--------------------------------------------------------------------------------
/template.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/template.zip
--------------------------------------------------------------------------------
/template/build.bat:
--------------------------------------------------------------------------------
1 | pandoc -s -S -c pmag.css -B header.htm -A footer.htm template.md -o template.htm
2 | pandoc -s -S template.md -o template.odt
--------------------------------------------------------------------------------
/template/footer.htm:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/template/header.htm:
--------------------------------------------------------------------------------
1 |
4 |
5 |
--------------------------------------------------------------------------------
/template/pmag.css:
--------------------------------------------------------------------------------
1 | html, body, div, span, applet, object, iframe,
2 | h1, h2, h3, h4, h5, h6, 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 | }
21 |
22 | h1, h2, h3, h4, h5, h6 {
23 | margin: 0;
24 | font-weight: 700;
25 | color:#222222;
26 | }
27 |
28 | h1 {
29 | font-size: 36px;
30 | font-family: '標楷體', 'Times New Roman';
31 | }
32 |
33 | h2 {
34 | font-size: 28px;
35 | font-family: '標楷體', 'Times New Roman';
36 | }
37 |
38 | h3 {
39 | font-size: 24px;
40 | font-family: '標楷體', 'Times New Roman';
41 | }
42 |
43 | h4 {
44 | font-size: 21px;
45 | }
46 |
47 | h5 {
48 | font-size: 18px;
49 | }
50 |
51 | h6 {
52 | font-size: 16px;
53 | }
54 |
55 | p {
56 | margin: 10px 0 15px 0;
57 | }
58 |
59 | footer p {
60 | color: #f2f2f2;
61 | }
62 |
63 | a {
64 | text-decoration: none;
65 | color: #007edf;
66 | text-shadow: none;
67 |
68 | transition: color 0.5s ease;
69 | transition: text-shadow 0.5s ease;
70 | -webkit-transition: color 0.5s ease;
71 | -webkit-transition: text-shadow 0.5s ease;
72 | -moz-transition: color 0.5s ease;
73 | -moz-transition: text-shadow 0.5s ease;
74 | -o-transition: color 0.5s ease;
75 | -o-transition: text-shadow 0.5s ease;
76 | -ms-transition: color 0.5s ease;
77 | -ms-transition: text-shadow 0.5s ease;
78 | }
79 |
80 | table {
81 | border-collapse: collapse;
82 | border-spacing: 0;
83 | border: 1px solid #373737;
84 | margin-bottom: 20px;
85 | text-align: left;
86 | margin-left:auto;
87 | margin-right:auto;
88 | }
89 |
90 | th {
91 | padding: 10px;
92 | background-color:black;
93 | color:white;
94 | }
95 |
96 | td {
97 | padding: 10px;
98 | border: 1px solid #373737;
99 | }
100 |
101 | em {
102 | font-weight:bold;
103 | }
104 |
105 | #header_wrap {
106 | margin: 0;
107 | padding: 16px;
108 | border: 0;
109 | font: inherit;
110 | vertical-align: baseline;
111 | background-color:black;
112 | color:white;
113 | }
114 |
115 | #header_wrap h1, h1 sub {
116 | color:white;
117 | }
118 |
119 | h2 {
120 | text-align:center;
121 | color:black;
122 | }
123 |
124 | #header_wrap sub {
125 | color:white;
126 | font-size:60%;
127 | }
128 |
129 | .title {
130 | color:#333333;
131 | text-align:center;
132 | font-size:24px;
133 | font-family: '標楷體', 'Times New Roman';
134 | }
135 |
136 | .author, .date {
137 | color:#333333;
138 | text-align:center;
139 | font-size:12px;
140 | font-family: '細明體', 'Times New Roman';
141 | }
142 |
143 | #content {
144 | margin:10px;
145 | padding:10px;
146 | }
147 |
148 | pre {
149 | background-color:#dddddd;
150 | color:#333333;
151 | width:100%;
152 | }
153 |
154 | .figure {
155 | width:800px;
156 | margin-left:auto;
157 | margin-right:auto;
158 | }
159 |
160 | /*
161 | .figure {
162 | FLOAT: right; MARGIN: 15PX;
163 | }
164 | */
165 | .caption {
166 | text-align:center;
167 | }
168 |
169 | #TOC {
170 | }
171 |
172 | #footer {
173 | text-align:center;
174 | font-size:12px;
175 | color:#666666;
176 | margin: 10px;
177 | padding: 10px;
178 | }
179 |
--------------------------------------------------------------------------------
/template/sample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/template/sample.png
--------------------------------------------------------------------------------
/template/submit.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/template/submit.md
--------------------------------------------------------------------------------
/template/template.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
27 |
28 |
29 |
30 |
33 |
34 |
投稿文章標題
35 |
投稿文章子標題 1
36 |
… 段落範例 ….
37 |
段落1
38 |
… 圖形範例 ….
39 |
42 |
… 程式範例 ….
43 |
段落2
44 |
var http = require('http' );
45 |
46 | http .createServer (function (request, response) {
47 | response .writeHead (200 , {'Content-Type' : 'text/plain' });
48 | response .end ('Hello World\n' );
49 | }).listen (8000 );
50 |
51 | console .log ('Server running at http://127.0.0.1:8000/' );
52 |
投稿文章子標題 2
53 |
…. 表格範例 …..
54 |
55 |
56 |
62 |
63 |
64 |
65 | 內容1
66 | 內容1
67 | 內容1
68 | 內容1
69 |
70 |
71 |
72 |
內文連結範例:Yahoo奇摩
73 |
網址連結顯示範例:http://tw.yahoo.com
74 |
後置連結範例:Yahoo
75 |
76 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/template/template.md:
--------------------------------------------------------------------------------
1 | ### 投稿文章標題
2 |
3 | #### 投稿文章子標題 1
4 |
5 | ... 段落範例 ....
6 |
7 | 段落1
8 |
9 | ... 圖形範例 ....
10 |
11 | 
12 |
13 | ... 程式範例 ....
14 |
15 |
16 | 段落2
17 |
18 | ```JavaScript
19 | var http = require('http');
20 |
21 | http.createServer(function (request, response) {
22 | response.writeHead(200, {'Content-Type': 'text/plain'});
23 | response.end('Hello World\n');
24 | }).listen(8000);
25 |
26 | console.log('Server running at http://127.0.0.1:8000/');
27 | ```
28 |
29 | #### 投稿文章子標題 2
30 |
31 | .... 表格範例 .....
32 |
33 | 欄位1 欄位2 欄位3 欄位4
34 | ---------- --------- -------- --------
35 | 內容1 內容1 內容1 內容1
36 |
37 |
38 | 內文連結範例:[Yahoo奇摩](http://tw.yahoo.com)
39 |
40 | 網址連結顯示範例:
41 |
42 | 後置連結範例:[Yahoo]
43 |
44 | [Yahoo]: http://tw.yahoo.com
45 |
--------------------------------------------------------------------------------
/template/template.odt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/programmermagazine/201303/b596d29d018b93af76f9a16f4704380d4719dd21/template/template.odt
--------------------------------------------------------------------------------