40
|
1 local Luan = require "luan:Luan.luan"
|
|
2 local error = Luan.error
|
|
3 local pairs = Luan.pairs or error()
|
|
4 local Io = require "luan:Io.luan"
|
|
5 local Http = require "luan:http/Http.luan"
|
|
6 local Shared = require "site:/lib/Shared.luan"
|
|
7 local head = Shared.head or error()
|
|
8 local header = Shared.header or error()
|
|
9
|
|
10
|
|
11 local content = {
|
|
12 intro = {
|
52
|
13 title = [[Introduction]]
|
40
|
14 content = function()
|
|
15 %>
|
|
16 <p>Learning reactionary programming will give you a deep understanding of programming and will enable to you to write your own programs and websites. However this is not enough to get a job with modern scum (members of depraved modern culture). Modern scum will expect you to use tools popular with them, so you would have to learn one of those. Probably the least horrible programming tool used by modern scum is <a href="python.html">Python</a>, so I would recommend learning that if you want a job.</p>
|
|
17
|
41
|
18 <p>The next 3 lessons are basic computer literacy. Even if you are not interested in programming, these would be useful skills.</p>
|
|
19
|
40
|
20 <p>I will develop this course incrementally based on demand. Whenever anyone completes the content here, I will add another lesson/section. This way I won't waste my time writing content that no one will use.</p>
|
|
21
|
|
22 <p>This course will be designed for you to learn reactionary programming in a logical sequence. I will focus on finding relevant resources, and I will only write explanations when nothing else is available on the subject. I will focus on web development since that is what I know best.</p>
|
|
23
|
41
|
24 <p>I will often say "Do X" without saying how to do X. A big part of programming is figuring out how to do things. Your two main resources are Google and ChatGPT. If you get stuck, you can ask me.</p>
|
40
|
25
|
|
26 <p>ChatGPT has become an essential programming tool. So the only task for this lesson is to play with ChatGPT. Later you can ask it technical questions.</p>
|
41
|
27
|
|
28 <p>If you have any questions, you can <a href="https://discord.gg/Qdcgvm3aAq">ask me on Discord</a>.</p>
|
40
|
29 <%
|
|
30 end
|
|
31 }
|
|
32 editor = {
|
52
|
33 title = [[Text Editor and JSON]]
|
40
|
34 content = function()
|
|
35 %>
|
42
|
36 <p>A text editor is a basic tool for reactionary programmers. We use simple flexible tools. Modern scum use an <a href="https://en.wikipedia.org/wiki/Integrated_development_environment">IDE</a> which is big, <a href="http://www.mikraite.org/Changed-my-mind-about-IDE-s-tp2769.html">complicated</a>, and inflexible. We don't use such tools.</p>
|
|
37
|
|
38 <p>I reviewed the available text editors and I think <a href="https://www.sublimetext.com/">Sublime Text</a> is the best one available. So please download it and learn how it works.</p>
|
|
39
|
43
|
40 <p><a href="https://en.wikipedia.org/wiki/JSON">JSON</a> is the most popular text data format. I think JSON was the last good programming idea from modern culture, developed around 2001, before modern culture became fully depraved. Do your own research on JSON to understand it. It is fairly simple.</p>
|
42
|
41
|
44
|
42 <p>I paired Sublime Text with JSON because Sublime Text uses JSON files for its <a href="https://www.sublimetext.com/docs/settings.html">settings</a>. (Actually not quite pure JSON because it includes comments which are lines starting with <code>//</code>.) Experiment with Sublime Text settings to learn more about both Sublime Text and JSON.</p>
|
40
|
43 <%
|
|
44 end
|
|
45 }
|
41
|
46 bash = {
|
52
|
47 title = [[Bash - Command Line Shell]]
|
41
|
48 content = function()
|
|
49 %>
|
49
|
50 <p><a href="bash.html">Bash</a> is the other basic tool for reactionary programmers. I was hoping to just reference existing Bash tutorials in this lesson, but they are all horrible, so I am writing my own. So for this lesson, please read <a href="learn_bash.html">my tutorial</a>.</p>
|
41
|
51 <%
|
|
52 end
|
|
53 }
|
|
54 hg = {
|
52
|
55 title = [[Mercurial - Source Control]]
|
41
|
56 content = function()
|
|
57 %>
|
54
|
58 <p>Thankfully <a href="mercurial.html">Mercurial</a> is well documented. Read <a href="http://hgbook.red-bean.com/">Mercurial: The Definitive Guide</a> up to chapter 9.</p>
|
|
59
|
|
60 <p>To get started with Mercurial, download Mercurial from <a href="https://www.mercurial-scm.org/">their website</a> and install it. Then do:</p>
|
|
61
|
|
62 <code block>
|
|
63 ~/learn $ hg version
|
|
64 Mercurial Distributed SCM (version 5.2.2)
|
|
65 (see https://mercurial-scm.org for more information)
|
|
66
|
|
67 Copyright (C) 2005-2019 Matt Mackall and others
|
|
68 This is free software; see the source for copying conditions. There is NO
|
|
69 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
70 ~/learn $
|
|
71 </code>
|
|
72
|
|
73 <p>If this works, it is installed properly. Next <a href="http://hgbook.red-bean.com/read/a-tour-of-mercurial-the-basics.html#sec:tour-basic:username">set up your Mercurial configuration file</a> which is <code>~/.hgrc</code> on a Mac or <code>/c/Users/$(whoami)/mercurial.ini</code> on Windows. My <code>.hgrc</code> file looks like this:
|
|
74
|
|
75 <code block>
|
|
76 [ui]
|
|
77 username = Franklin Schmidt <fschmidt@gmail.com>
|
|
78
|
|
79 [auth]
|
|
80 hghosting.prefix = https://hg.reactionary.software/repo/
|
|
81 hghosting.username = fschmidt@gmail.com
|
|
82 hghosting.password = xxxxxxxxxx
|
|
83
|
|
84 [extensions]
|
|
85 hgext.extdiff =
|
|
86
|
|
87 [extdiff]
|
|
88 cmd.dm = diffmerge
|
|
89 </code>
|
|
90
|
56
|
91 <p>You should register on <a href="https://hg.reactionary.software/">our Mercurial hosting service</a> and use your email as the username and the assigned password in <code>.hgrc</code>. The last two blocks set up <code>hg dm</code> to call <a href="https://sourcegear.com/diffmerge/">DiffMerge</a> by using the <a href="https://wiki.mercurial-scm.org/ExtdiffExtension">Extdiff extension</a>.</p>
|
54
|
92
|
|
93 <p>Now you can play with <a href="https://hg.reactionary.software/repo/test/">https://hg.reactionary.software/repo/test/</a> like this:</p>
|
|
94
|
|
95 <code block>
|
|
96 ~/learn $ hg clone https://hg.reactionary.software/repo/test/ hgtest1
|
|
97 no changes found
|
|
98 updating to branch default
|
|
99 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
100 ~/learn $ hg clone https://hg.reactionary.software/repo/test/ hgtest2
|
|
101 no changes found
|
|
102 updating to branch default
|
|
103 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
104 ~/learn $ ls -Fd h*
|
|
105 hgtest1/ hgtest2/
|
|
106 ~/learn $ cd hgtest1
|
|
107 ~/learn/hgtest1 $ touch file.txt
|
|
108 ~/learn/hgtest1 $ e file.txt
|
|
109 ~/learn/hgtest1 $ cat file.txt
|
|
110 some text
|
|
111 ~/learn/hgtest1 $ hg status
|
|
112 ? file.txt
|
|
113 ~/learn/hgtest1 $ hg add file.txt
|
|
114 ~/learn/hgtest1 $ hg status
|
|
115 A file.txt
|
|
116 ~/learn/hgtest1 $ hg pull
|
|
117 pulling from https://hg.reactionary.software/repo/test/
|
|
118 no changes found
|
|
119 ~/learn/hgtest1 $ hg commit -m 'add file.txt'
|
|
120 ~/learn/hgtest1 $ hg push
|
|
121 pushing to https://hg.reactionary.software/repo/test/
|
|
122 searching for changes
|
|
123 remote: adding changesets
|
|
124 remote: adding manifests
|
|
125 remote: adding file changes
|
|
126 remote: added 1 changesets with 1 changes to 1 files
|
|
127 ~/learn/hgtest1 $ cd ../hgtest2
|
|
128 ~/learn/hgtest2 $ hg pull
|
|
129 pulling from https://hg.reactionary.software/repo/test/
|
|
130 requesting all changes
|
|
131 adding changesets
|
|
132 adding manifests
|
|
133 adding file changes
|
|
134 added 1 changesets with 1 changes to 1 files
|
|
135 new changesets aab34516d8dc
|
|
136 (run 'hg update' to get a working copy)
|
|
137 ~/learn/hgtest2 $ hg update
|
|
138 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
139 ~/learn/hgtest2 $ hg status
|
|
140 ~/learn/hgtest2 $ cat file.txt
|
|
141 some text
|
|
142 ~/learn/hgtest2 $ e file.txt
|
|
143 ~/learn/hgtest2 $ cat file.txt
|
|
144 some text
|
|
145 and more
|
|
146 ~/learn/hgtest2 $ hg status
|
|
147 M file.txt
|
|
148 ~/learn/hgtest2 $ hg pull
|
|
149 pulling from https://hg.reactionary.software/repo/test/
|
|
150 searching for changes
|
|
151 no changes found
|
|
152 ~/learn/hgtest2 $ hg dm
|
|
153 ~/learn/hgtest2 $ hg commit -m 'and more'
|
|
154 ~/learn/hgtest2 $ hg push
|
|
155 pushing to https://hg.reactionary.software/repo/test/
|
|
156 searching for changes
|
|
157 remote: adding changesets
|
|
158 remote: adding manifests
|
|
159 remote: adding file changes
|
|
160 remote: added 1 changesets with 1 changes to 1 files
|
|
161 </code>
|
|
162
|
41
|
163 <%
|
|
164 end
|
|
165 }
|
|
166 html = {
|
52
|
167 title = [[HTML and CSS]]
|
41
|
168 content = function()
|
|
169 %>
|
|
170 <p>later</p>
|
|
171 <%
|
|
172 end
|
|
173 }
|
|
174 js = {
|
52
|
175 title = [[JavaScript]]
|
41
|
176 content = function()
|
|
177 %>
|
|
178 <p>later</p>
|
|
179 <%
|
|
180 end
|
|
181 }
|
|
182 luan = {
|
52
|
183 title = [[Luan]]
|
41
|
184 content = function()
|
|
185 %>
|
|
186 <p>later</p>
|
|
187 <%
|
|
188 end
|
|
189 }
|
|
190 http = {
|
52
|
191 title = [[HTTP]]
|
|
192 content = function()
|
|
193 %>
|
|
194 <p>later</p>
|
|
195 <%
|
|
196 end
|
|
197 }
|
|
198 regex = {
|
|
199 title = [[Regular Expressions]]
|
41
|
200 content = function()
|
|
201 %>
|
|
202 <p>later</p>
|
|
203 <%
|
|
204 end
|
|
205 }
|
|
206 java = {
|
52
|
207 title = [[Java 8]]
|
|
208 content = function()
|
|
209 %>
|
|
210 <p>later</p>
|
|
211 <%
|
|
212 end
|
|
213 }
|
|
214 lucene = {
|
|
215 title = [[Lucene]]
|
41
|
216 content = function()
|
|
217 %>
|
|
218 <p>later</p>
|
|
219 <%
|
|
220 end
|
|
221 }
|
40
|
222 }
|
|
223
|
|
224
|
|
225 local function show_toc(content)
|
|
226 %>
|
|
227 <ul>
|
|
228 <%
|
|
229 for id, info in pairs(content) do
|
|
230 %>
|
|
231 <li><a id="c_<%=id%>" href="#<%=id%>"><%=info.title%></a></li>
|
|
232 <%
|
|
233 end
|
|
234 %>
|
|
235 </ul>
|
|
236 <%
|
|
237 end
|
|
238
|
|
239 local function show_content(content,h)
|
|
240 for id, info in pairs(content) do
|
|
241 %>
|
|
242 <div heading>
|
|
243 <h<%=h%>><a id="<%=id%>" href="#<%=id%>"><%=info.title%></a></h<%=h%>>
|
|
244 <a href="#c_<%=id%>">contents</a>
|
|
245 </div>
|
|
246 <%
|
|
247 info.content()
|
|
248 end
|
|
249 end
|
|
250
|
|
251 return function()
|
|
252 Io.stdout = Http.response.text_writer()
|
|
253 %>
|
|
254 <!doctype html>
|
|
255 <html>
|
|
256 <head>
|
|
257 <% head() %>
|
|
258 <title>Learn Reactionary Programming</title>
|
|
259 </head>
|
|
260 <body>
|
|
261 <% header() %>
|
|
262 <div content>
|
|
263 <h1><a href="learn.html">Learn Reactionary Programming</a></h1>
|
|
264 <hr>
|
|
265 <h2>Contents</h2>
|
|
266 <div toc>
|
|
267 <% show_toc(content) %>
|
|
268 </div>
|
|
269 <hr>
|
|
270 <% show_content(content,2) %>
|
|
271 </div>
|
|
272 </body>
|
|
273 </html>
|
|
274 <%
|
|
275 end
|