codemadness - sfeed_tests - sfeed tests and RSS and Atom files | |
git clone git://git.codemadness.org/sfeed_tests | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
codemadness (109825B) | |
--- | |
1 <?xml version="1.0" encoding="UTF-8"?> | |
2 <feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"> | |
3 <title type="text">Codemadness</title> | |
4 <subtitle type="text">blog with various projects and articles ab… | |
5 <updated>2020-09-03T00:00:00Z</updated> | |
6 <link rel="alternate" type="text/html" href="https://www.codemad… | |
7 <id>https://www.codemadness.org/atom.xml</id> | |
8 <link rel="self" type="application/atom+xml" href="https://www.c… | |
9 <entry> | |
10 <title type="text">Sfeed_curses: a curses UI front-end for sfeed… | |
11 <link rel="alternate" type="text/html" href="https://www.codemad… | |
12 <id>https://www.codemadness.org/sfeed_curses-ui.html</id> | |
13 <updated>2020-08-30T00:00:00Z</updated> | |
14 <published>2020-06-25T00:00:00Z</published> | |
15 <author> | |
16 <name>hiltjo</name> | |
17 <uri>https://www.codemadness.org</uri> | |
18 </author> | |
19 <summary type="text">Sfeed_curses is a curses UI front-end for t… | |
20 <content type="html"><![CDATA[<h1>Sfeed_curses: a curses UI fron… | |
21 <p><strong>Last modification on </strong> <time>2020-08-30</time… | |
22 <p>sfeed_curses is a curses UI front-end for <a href="sfeed.html… | |
23 | |
24 <p>It shows the TAB-separated feed items in a graphical command-line UI.… | |
25 interface has a look inspired by the <a href="http://www.mutt.org/">mutt… | |
26 client</a>. It has a sidebar panel for the feeds, a panel with a listin… | |
27 the items and a small statusbar for the selected item/url. Some function… | |
28 searching and scrolling are integrated in the interface itself.</p> | |
29 | |
30 | |
31 <h2>Features</h2> | |
32 <ul> | |
33 <li>Relatively few LOC, about 2K lines of C.</li> | |
34 <li>Few dependencies: a C compiler and a curses library (typically ncurs… | |
35 It also requires a terminal (emulator) supporting UTF-8.</li> | |
36 <li>Easy to customize by modifying the small source-code and shellscript… | |
37 <li>Quite fast.</li> | |
38 <li>Plumb support: open the url or an enclosure url directly with any pr… | |
39 <li>Pipe support: pipe the selected Tab-Separated Value line to a progra… | |
40 scripting purposes. Like viewing the content in any way you like.</l… | |
41 <li>Yank support: copy the url or an enclosure url to the clipboard.</li> | |
42 <li>Familiar keybinds: supports both vi-like, emacs-like and arrow keys … | |
43 actions.</li> | |
44 <li>Mouse support: xterm mouse-mode, if supported by the terminal emulat… | |
45 <li>Support two ways of managing read/unread items. | |
46 By default sfeed_curses marks the feed items of the last day as new/… | |
47 Alternatively a simple plain-text list with the read urls can be use… | |
48 </ul> | |
49 | |
50 | |
51 <p>Like the format programs included in sfeed you can run it by giving t… | |
52 files as arguments like this:</p> | |
53 <pre><code>sfeed_curses ~/.sfeed/feeds/*</code></pre> | |
54 | |
55 <p>... or by reading directly from stdin:</p> | |
56 <pre><code>sfeed_curses < ~/.sfeed/feeds/xkcd</code></pre> | |
57 | |
58 <p>It will show a sidebar if one or more files are specified as paramete… | |
59 not show the sidebar by default when reading from stdin.</p> | |
60 | |
61 <p><a href="downloads/screenshots/sfeed_curses_screenshot.png"><img src=… | |
62 | |
63 | |
64 <p>On pressing the 'o' or ENTER keybind it will open the link url of an … | |
65 On pressing the 'a', 'e' or '@' keybind it will open the enclosure url i… | |
66 The default plumb program is set to "<a href="https://portland.freedeskt… | |
67 but can be modified by setting the environment variable $SFEED_PLUMBER. | |
68 The plumb program receives the url as a command-line argument.</p> | |
69 | |
70 | |
71 <p>The TAB-Separated-Value line of the current selected item in the feed… | |
72 can be piped to a program by pressing the 'c', 'p' or '|' keybind. This … | |
73 much flexibility to make a content formatter or write other custom actio… | |
74 views. This line is in the exact same format as described in the sfeed(… | |
75 page. | |
76 The pipe program can be changed by setting the environment variable $SFE… | |
77 </p> | |
78 | |
79 <p><a href="downloads/screenshots/sfeed_curses_pipe_screenshot.png"><img… | |
80 | |
81 <p>The above screenshot shows the included | |
82 <a href="https://git.codemadness.org/sfeed_curses/file/sfeed_content.htm… | |
83 shellscript which uses the <a href="https://invisible-island.net/lynx/">… | |
84 to convert HTML to plain-text. | |
85 It pipes the formatted plain-text to the user $PAGER (or "less"). | |
86 Of course the script can be easily changed to use a different browser li… | |
87 <a href="http://w3m.sourceforge.net/">w3m</a>, | |
88 <a href="http://www.jikos.cz/~mikulas/links/">links</a>, | |
89 <a href="https://www.dillo.org/">dillo</a> or | |
90 <a href="https://git.codemadness.org/webdump/file/README.html">webdump</… | |
91 | |
92 <p>It's easy to modify the colorscheme by changing the macros in the sou… | |
93 On the left a <a href="https://templeos.org/">TempleOS</a>-like colorsch… | |
94 The README file contains the macros for these schemes.</p> | |
95 | |
96 <p><a href="downloads/screenshots/sfeed_curses_theme_screenshot.png"><im… | |
97 | |
98 | |
99 <h2>Clone</h2> | |
100 <pre><code>git clone git://<a href="//git.codemadness.org/sfeed_curses/"… | |
101 | |
102 | |
103 <h2>Download releases</h2> | |
104 <p> | |
105 Releases are available at: | |
106 <a href="/releases/sfeed_curses/">https://codemadness.org/releases/sfeed… | |
107 </p> | |
108 | |
109 | |
110 <h2>Build and install</h2> | |
111 | |
112 <pre><code>$ make | |
113 # make install</code></pre> | |
114 ]]></content> | |
115 </entry> | |
116 <entry> | |
117 <title type="text">hurl: HTTP, HTTPS and Gopher file grabber</ti… | |
118 <link rel="alternate" type="text/html" href="https://www.codemad… | |
119 <id>https://www.codemadness.org/hurl.html</id> | |
120 <updated>2020-07-20T00:00:00Z</updated> | |
121 <published>2019-11-10T00:00:00Z</published> | |
122 <author> | |
123 <name>hiltjo</name> | |
124 <uri>https://www.codemadness.org</uri> | |
125 </author> | |
126 <summary type="text">hurl: HTTP, HTTPS and Gopher file grabber</… | |
127 <content type="html"><![CDATA[<h1>hurl: HTTP, HTTPS and Gopher f… | |
128 <p><strong>Last modification on </strong> <time>2020-07-20</time… | |
129 <p>hurl is a relatively simple HTTP, HTTPS and Gopher client/fil… | |
130 | |
131 | |
132 <h2>Why?</h2> | |
133 | |
134 <p>Sometimes (or most of the time?) you just want to fetch a file via th… | |
135 HTTPS or Gopher protocol.</p> | |
136 | |
137 <p>The focus of this tool is only this.</p> | |
138 | |
139 | |
140 <h2>Features</h2> | |
141 | |
142 <ul> | |
143 <li>Uses OpenBSD pledge(2) and unveil(2). Allow no filesystem access (wr… | |
144 stdout).</li> | |
145 <li>Impose time-out and maximum size limits.</li> | |
146 <li>Use well-defined exitcodes for reliable scripting (curl sucks at thi… | |
147 <li>Send as little information as possible (no User-Agent etc by default… | |
148 </ul> | |
149 | |
150 | |
151 <h2>Anti-features</h2> | |
152 | |
153 <ul> | |
154 <li>No HTTP byte range support.</li> | |
155 <li>No HTTP User-Agent.</li> | |
156 <li>No HTTP If-Modified-Since/If-* support.</li> | |
157 <li>No HTTP auth support.</li> | |
158 <li>No HTTP/2+ support.</li> | |
159 <li>No HTTP keep-alive.</li> | |
160 <li>No HTTP chunked-encoding support.</li> | |
161 <li>No HTTP redirect support.</li> | |
162 <li>No (GZIP) compression support.</li> | |
163 <li>No cookie-jar or cookie parsing support.</li> | |
164 <li>No Gopher text handling (".\r\n").</li> | |
165 <li>... etc...</li> | |
166 </ul> | |
167 | |
168 | |
169 <h2>Dependencies</h2> | |
170 | |
171 <ul> | |
172 <li>C compiler (C99).</li> | |
173 <li>libc + some BSD functions like err() and strlcat().</li> | |
174 <li>LibreSSL(-portable)</li> | |
175 <li>libtls (part of LibreSSL).</li> | |
176 </ul> | |
177 | |
178 | |
179 <h2>Optional dependencies</h2> | |
180 | |
181 <ul> | |
182 <li>POSIX make(1) (for Makefile).</li> | |
183 <li>mandoc for documentation: https://mdocml.bsd.lv/</li> | |
184 </ul> | |
185 | |
186 | |
187 <h2>Clone</h2> | |
188 <pre><code>git clone git://<a href="//git.codemadness.org/hurl/">git.cod… | |
189 | |
190 | |
191 <h2>Download releases</h2> | |
192 <p> | |
193 Releases are available at: | |
194 <a href="/releases/hurl/">https://codemadness.org/releases/hurl/</a>. | |
195 </p> | |
196 | |
197 | |
198 <h2>Build and install</h2> | |
199 | |
200 <pre><code>$ make | |
201 # make install</code></pre> | |
202 | |
203 | |
204 <h2>Examples</h2> | |
205 | |
206 <p> | |
207 Fetch the Atom feed from this site using a maximum filesize limit of 1MB… | |
208 a time-out limit of 15 seconds: | |
209 </p> | |
210 | |
211 <pre><code>hurl -m 1048576 -t 15 "https://codemadness.org/atom.xml"</cod… | |
212 | |
213 <p> | |
214 There is an -H option to add custom headers. This way some of the anti-f… | |
215 listed above are supported. For example some CDNs like Cloudflare are kn… | |
216 empty or certain User-Agents. | |
217 </p> | |
218 | |
219 <p>User-Agent:</p> | |
220 | |
221 <pre><code>hurl -H 'User-Agent: some browser' 'https://codemadness.org/a… | |
222 | |
223 <p>HTTP Basic Auth (base64-encoded username:password):</p> | |
224 | |
225 <pre><code>hurl -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' 'http… | |
226 | |
227 <p>GZIP (this assumes the served response Content-Type is gzip):</p> | |
228 | |
229 <pre><code>hurl -H 'Accept-Encoding: gzip' 'https://somesite/' | gzip -d… | |
230 ]]></content> | |
231 </entry> | |
232 <entry> | |
233 <title type="text">json2tsv: a JSON to TSV converter</title> | |
234 <link rel="alternate" type="text/html" href="https://www.codemad… | |
235 <id>https://www.codemadness.org/json2tsv.html</id> | |
236 <updated>2020-07-20T00:00:00Z</updated> | |
237 <published>2019-10-13T00:00:00Z</published> | |
238 <author> | |
239 <name>hiltjo</name> | |
240 <uri>https://www.codemadness.org</uri> | |
241 </author> | |
242 <summary type="text">json2tsv: a JSON to TAB-Separated Value con… | |
243 <content type="html"><![CDATA[<h1>json2tsv: a JSON to TSV conver… | |
244 <p><strong>Last modification on </strong> <time>2020-07-20</time… | |
245 <p> | |
246 json2tsv reads JSON data from stdin. It outputs each JSON type to a | |
247 TAB-Separated Value format per line. | |
248 </p> | |
249 | |
250 | |
251 <h2>TAB-Separated Value format</h2> | |
252 | |
253 <p>The output format per line is:</p> | |
254 <pre><code>nodename<TAB>type<TAB>value<LF></code></pre> | |
255 | |
256 <p> | |
257 Control-characters such as a newline, TAB and backslash (\n, \t and \\) … | |
258 escaped in the nodename and value fields. Other control-characters are | |
259 removed. | |
260 </p> | |
261 | |
262 <p> | |
263 The type field is a single byte and can be: | |
264 </p> | |
265 | |
266 <ul> | |
267 <li>a for array</li> | |
268 <li>b for bool</li> | |
269 <li>n for number</li> | |
270 <li>o for object</li> | |
271 <li>s for string</li> | |
272 <li>? for null</li> | |
273 </ul> | |
274 | |
275 <p> | |
276 Filtering on the first field "nodename" is easy using awk for example. | |
277 </p> | |
278 | |
279 | |
280 <h2>Features</h2> | |
281 <ul> | |
282 <li>Accepts all <strong>valid</strong> JSON.</li> | |
283 <li>Designed to work well with existing UNIX programs like awk and grep.… | |
284 <li>Straightforward and not much lines of code: about 475 lines of C.</l… | |
285 <li>Few dependencies: C compiler (C99), libc.</li> | |
286 <li>No need to learn a new (meta-)language for processing data.</li> | |
287 <li>The parser supports code point decoding (\u2303) and UTF-16 surrogat… | |
288 <li>It does not output control-characters to the terminal for security r… | |
289 <li>On OpenBSD it supports <a href="https://man.openbsd.org/pledge">pled… | |
290 </ul> | |
291 | |
292 | |
293 <h2>Cons</h2> | |
294 <ul> | |
295 <li>For the tool there is additional overhead by processing and filterin… | |
296 from stdin after parsing.</li> | |
297 <li>The parser does not do complete validation on numbers.</li> | |
298 <li>The parser accepts some bad input such as invalid UTF-8 | |
299 (see <a href="https://tools.ietf.org/html/rfc8259#section-8.1">RFC82… | |
300 json2tsv reads from stdin and does not do assumptions about a "close… | |
301 as described in the RFC.</li> | |
302 <li>The parser accepts some bad JSON input and "extensions" | |
303 (see <a href="https://tools.ietf.org/html/rfc8259#section-9">RFC8259… | |
304 <li>Encoded NUL bytes (\u0000) in strings are ignored. | |
305 (see <a href="https://tools.ietf.org/html/rfc8259#section-9">RFC8259… | |
306 "An implementation may set limits on the length and character conten… | |
307 strings."</li> | |
308 <li>The parser is not the fastest possible JSON parser (but also not the… | |
309 For example: for ease of use, at the cost of performance all strings… | |
310 decoded, even though they may be unused. | |
311 </li> | |
312 </ul> | |
313 | |
314 | |
315 <h2>Why Yet Another JSON parser?</h2> | |
316 <p> | |
317 I wanted a tool that makes parsing JSON easier and work well from the sh… | |
318 <a href="https://stedolan.github.io/jq/">jq</a>. | |
319 </p> | |
320 | |
321 <p> | |
322 sed and grep often work well enough for matching some value using some r… | |
323 but it is not good enough to parse JSON correctly or to extract all info… | |
324 just like parsing HTML/XML using some regex is not good (enough) or a go… | |
325 </p> | |
326 | |
327 <p> | |
328 I didn't want to learn a new | |
329 <a href="https://stedolan.github.io/jq/manual/#Builtinoperatorsandfuncti… | |
330 and wanted something simpler. | |
331 While it is more efficient to embed this query language for data aggrega… | |
332 it is also less simple. In my opinion it is simpler to separate this and… | |
333 pattern-processing by awk or an other filtering/aggregating program. | |
334 </p> | |
335 | |
336 <p> | |
337 For the parser, there are many JSON parsers out there, like the efficient | |
338 <a href="https://github.com/zserge/jsmn">jsmn parser</a>, however a few … | |
339 behaviours I want to have are: | |
340 </p> | |
341 | |
342 <ul> | |
343 <li>jsmn buffers data as tokens, which is very efficient, but also a bit | |
344 annoying as an API as it requires another layer of code to interpret… | |
345 tokens.</li> | |
346 <li>jsmn does not handle decoding strings by default. Which is very effi… | |
347 if you don't need parts of the data though.</li> | |
348 <li>jsmn does not keep context of nested structures by default, so again… | |
349 writing custom utility functions for nested data.</li> | |
350 </ul> | |
351 | |
352 <p> | |
353 I went for a parser design that uses a single callback per "node" type a… | |
354 keeps track of the current nested structure in a single array and emits … | |
355 </p> | |
356 | |
357 | |
358 <h2>Clone</h2> | |
359 <pre><code>git clone git://<a href="//git.codemadness.org/json2tsv/">git… | |
360 | |
361 | |
362 <h2>Download releases</h2> | |
363 <p> | |
364 Releases are available at: | |
365 <a href="/releases/json2tsv/">https://codemadness.org/releases/json2tsv/… | |
366 </p> | |
367 | |
368 | |
369 <h2>Build and install</h2> | |
370 | |
371 <pre><code>$ make | |
372 # make install</code></pre> | |
373 | |
374 | |
375 <h2>Examples</h2> | |
376 | |
377 <p> | |
378 An usage example to parse posts of the JSON API of | |
379 <a href="https://www.reddit.com/">reddit.com</a> | |
380 and format them to a plain-text list using awk: | |
381 </p> | |
382 | |
383 <pre><code>#!/bin/sh | |
384 curl -s -H 'User-Agent:' 'https://old.reddit.com/.json?raw_json=1&li… | |
385 json2tsv | \ | |
386 awk -F '\t' ' | |
387 function show() { | |
388 if (length(o["title"]) == 0) | |
389 return; | |
390 print n ". " o["title"] " by " o["author"] " in r/" o["subreddit… | |
391 print o["url"]; | |
392 print ""; | |
393 } | |
394 $1 == ".data.children[].data" { | |
395 show(); | |
396 n++; | |
397 delete o; | |
398 } | |
399 $1 ~ /^\.data\.children\[\]\.data\.[a-zA-Z0-9_]*$/ { | |
400 o[substr($1, 23)] = $3; | |
401 } | |
402 END { | |
403 show(); | |
404 }' | |
405 </code></pre> | |
406 | |
407 | |
408 <h2>References</h2> | |
409 <ul> | |
410 <li> | |
411 <strong>Sites:</strong> | |
412 <ul> | |
413 <li><a href="http://seriot.ch/parsing_json.php">seriot.ch - Pars… | |
414 <li><a href="https://github.com/nst/JSONTestSuite">A comprehensi… | |
415 <li><a href="https://json.org/">json.org</a></li> | |
416 </ul> | |
417 </li> | |
418 <li> | |
419 <strong>Current standard:</strong> | |
420 <ul> | |
421 <li><a href="https://tools.ietf.org/html/rfc8259">RFC8259 - The … | |
422 <li><a href="http://www.ecma-international.org/publications/stan… | |
423 </ul> | |
424 </li> | |
425 <li> | |
426 <strong>Historic standard:</strong> | |
427 <ul> | |
428 <li><a href="https://tools.ietf.org/html/rfc7159">RFC7159 - The … | |
429 <li><a href="https://tools.ietf.org/html/rfc7158">RFC7158 - The … | |
430 <li><a href="https://tools.ietf.org/html/rfc4627">RFC4627 - The … | |
431 </ul> | |
432 </li> | |
433 </ul> | |
434 ]]></content> | |
435 </entry> | |
436 <entry> | |
437 <title type="text">OpenBSD: setup a local auto-installation serv… | |
438 <link rel="alternate" type="text/html" href="https://www.codemad… | |
439 <id>https://www.codemadness.org/openbsd-autoinstall.html</id> | |
440 <updated>2020-04-30T00:00:00Z</updated> | |
441 <published>2019-04-24T00:00:00Z</published> | |
442 <author> | |
443 <name>hiltjo</name> | |
444 <uri>https://www.codemadness.org</uri> | |
445 </author> | |
446 <summary type="text">OpenBSD: setup a local auto-installation se… | |
447 <content type="html"><![CDATA[<h1>OpenBSD: setup a local auto-in… | |
448 <p><strong>Last modification on </strong> <time>2020-04-30</time… | |
449 <p>This guide describes how to setup a local mirror and installa… | |
450 server that requires little or no input interaction.</p> | |
451 | |
452 | |
453 <h2>Setup a local HTTP mirror</h2> | |
454 <p> | |
455 The HTTP mirror will be used to fetch the base sets and (optional) custo… | |
456 In this guide we will assume <b>192.168.0.2</b> is the local installation | |
457 server and mirror, the CPU architecture is amd64 and the OpenBSD release | |
458 version is 6.5. We will store the files in the directory with the struc… | |
459 </p> | |
460 | |
461 <pre><code>http://192.168.0.2/pub/OpenBSD/6.5/amd64/</code></pre> | |
462 | |
463 <p>Create the www serve directory and fetch all sets and install files | |
464 (if needed to save space *.iso and install65.fs can be skipped):</p> | |
465 | |
466 <pre><code>$ cd /var/www/htdocs | |
467 $ mkdir -p pub/OpenBSD/6.5/amd64/ | |
468 $ cd pub/OpenBSD/6.5/amd64/ | |
469 $ ftp 'ftp://ftp.nluug.nl/pub/OpenBSD/6.5/amd64/*'</code></pre> | |
470 | |
471 <p>Verify signature and check some checksums:</p> | |
472 <pre><code>$ signify -C -p /etc/signify/openbsd-65-base.pub -x SHA256.si… | |
473 | |
474 <p>Setup <a href="https://man.openbsd.org/httpd.8">httpd(8)</a> for simp… | |
475 <pre><code># $FAVORITE_EDITOR /etc/<a href="https://man.openbsd.org/http… | |
476 | |
477 <p>A minimal example config:</p> | |
478 <pre><code>server "*" { | |
479 listen on * port 80 | |
480 }</code></pre> | |
481 | |
482 <p>The default www root directory is: /var/www/htdocs/</p> | |
483 | |
484 <p>Enable the httpd daemon to start by default and start it now:</p> | |
485 <pre><code># rcctl enable httpd | |
486 # rcctl start httpd</code></pre> | |
487 | |
488 | |
489 <h2>Creating an installation response/answer file</h2> | |
490 <p>The installer supports loading responses to the installation/upgrade … | |
491 from a simple text file. We can do a regular installation and copy the a… | |
492 the saved file to make an automated version of it.</p> | |
493 | |
494 <p>Do a test installation, at the end of the installation or upgrade whe… | |
495 question:</p> | |
496 <pre><code>Exit to (S)hell, (H)alt or (R)eboot?</code></pre> | |
497 | |
498 <p>Type S to go to the shell. Find the response file for an installation… | |
499 write down the response answers:</p> | |
500 <pre><code>cp /tmp/i/install.resp /mnt/usbstick/</code></pre> | |
501 | |
502 <p>A response file could be for example:</p> | |
503 | |
504 <pre><code>System hostname = testvm | |
505 Which network interface do you wish to configure = em0 | |
506 IPv4 address for em0 = dhcp | |
507 IPv6 address for em0 = none | |
508 Which network interface do you wish to configure = done | |
509 Password for root account = $2b$10$IqI43aXjgD55Q3nLbRakRO/UAG6SAClL9pyk0… | |
510 Password for user testuser = $2b$10$IqI43aXjgD55Q3nLbRakRO/UAG6SAClL9pyk… | |
511 Start sshd(8) by default = no | |
512 Do you expect to run the X Window System = no | |
513 Setup a user = testuser | |
514 Full name for user testuser = testuser | |
515 What timezone are you in = Europe/Amsterdam | |
516 Which disk is the root disk = wd0 | |
517 Use (W)hole disk MBR, whole disk (G)PT, (O)penBSD area or (E)dit = OpenB… | |
518 Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout = a | |
519 Location of sets = http | |
520 HTTP proxy URL = none | |
521 HTTP Server = <b>192.168.0.2</b> | |
522 Server directory = pub/OpenBSD/6.5/amd64 | |
523 Unable to connect using https. Use http instead = yes | |
524 Location of sets = http | |
525 Set name(s) = done | |
526 Location of sets = done | |
527 Exit to (S)hell, (H)alt or (R)eboot = R</code></pre> | |
528 | |
529 <p>Get custom encrypted password for response file:</p> | |
530 <pre><code>$ printf '%s' 'yourpassword' | encrypt</code></pre> | |
531 | |
532 | |
533 <h2>Changing the RAMDISK kernel disk image</h2> | |
534 | |
535 <p><a href="https://man.openbsd.org/rdsetroot.8">rdsetroot(8)</a> is pub… | |
536 exposed now in base since 6.5. Before 6.5 it is available in the /usr/sr… | |
537 elfrdsetroot, see also the <a href="https://man.openbsd.org/rd.4">rd(4)<… | |
538 | |
539 <pre><code>$ mkdir auto | |
540 $ cd auto | |
541 $ cp pubdir/bsd.rd . | |
542 $ rdsetroot -x bsd.rd disk.fs | |
543 # vnconfig vnd0 disk.fs | |
544 # mkdir mount | |
545 # mount /dev/vnd0a mount</code></pre> | |
546 | |
547 <p>Copy the response file (install.resp) to: mount/auto_install.conf (in… | |
548 mount/auto_upgrade.conf (upgrade), but not both. In this guide we will d… | |
549 auto-installation.</p> | |
550 | |
551 <p>Unmount, detach and patch RAMDISK:</p> | |
552 <pre><code># umount mount | |
553 # vnconfig -u vnd0 | |
554 $ rdsetroot bsd.rd disk.fs</code></pre> | |
555 | |
556 <p>To test copy bsd.rd to the root of some testmachine like /bsd.test.rd… | |
557 (re)boot and type:</p> | |
558 <pre><code>boot /bsd.test.rd</code></pre> | |
559 | |
560 <p>In the future (6.5+) it will be possible to copy to a file named "/bs… | |
561 and automatically load the kernel: | |
562 <a href="https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/stand/boot/bo… | |
563 ofcourse this is possible with PXE boot or some custom USB/ISO also. | |
564 As explained in the <a href="https://man.openbsd.org/autoinstall.8">auto… | |
565 create either an auto_upgrade.conf <b>or</b> an auto_install.conf, but n… | |
566 </p> | |
567 | |
568 | |
569 <h2>Create bootable miniroot</h2> | |
570 | |
571 <p>In this example the miniroot will boot the custom kernel, but fetch a… | |
572 sets from the local network.</p> | |
573 | |
574 <p>We will base our miniroot of the official version: miniroot65.fs.</p> | |
575 | |
576 <p>We will create a 16MB miniroot to boot from (in this guide it is assu… | |
577 original miniroot is about 4MB and the modified kernel image fits in the… | |
578 allocated space):</p> | |
579 | |
580 <pre><code>$ dd if=/dev/zero of=new.fs bs=512 count=32768</code></pre> | |
581 | |
582 <p>Copy first part of the original image to the new disk (no truncation)… | |
583 | |
584 <pre><code>$ dd conv=notrunc if=miniroot65.fs of=new.fs | |
585 # vnconfig vnd0 new.fs</code></pre> | |
586 | |
587 | |
588 <p>Expand disk OpenBSD boundaries:</p> | |
589 | |
590 <pre><code># disklabel -E vnd0 | |
591 > <b>b</b> | |
592 Starting sector: [1024] | |
593 Size ('*' for entire disk): [8576] <b>*</b> | |
594 > <b>r</b> | |
595 Total free sectors: 1168. | |
596 > <b>c a</b> | |
597 Partition a is currently 8576 sectors in size, and can have a maximum | |
598 size of 9744 sectors. | |
599 size: [8576] <b>*</b> | |
600 > <b>w</b> | |
601 > <b>q</b></code></pre> | |
602 | |
603 <p>or:</p> | |
604 | |
605 <pre><code># printf 'b\n\n*\nc a\n*\nw\n' | disklabel -E vnd0</code></pr… | |
606 | |
607 | |
608 <p>Grow filesystem and check it and mark as clean:</p> | |
609 | |
610 <pre><code># growfs -y /dev/vnd0a | |
611 # fsck -y /dev/vnd0a</code></pre> | |
612 | |
613 | |
614 <p>Mount filesystem:</p> | |
615 <pre><code># mount /dev/vnd0a mount/</code></pre> | |
616 | |
617 <p>The kernel on the miniroot is GZIP compressed. Compress our modified … | |
618 and overwrite the original kernel:</p> | |
619 | |
620 <pre><code># gzip -c9n bsd.rd > mount/bsd</code></pre> | |
621 | |
622 <p>Or to save space (+- 500KB) by stripping debug symbols, taken from bs… | |
623 <a href="https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/distrib/amd64/iso… | |
624 | |
625 <pre><code>$ cp bsd.rd bsd.strip | |
626 $ strip bsd.strip | |
627 $ strip -R .comment -R .SUNW_ctf bsd.strip | |
628 $ gzip -c9n bsd.strip > bsd.gz | |
629 $ cp bsd.gz mount/bsd</code></pre> | |
630 | |
631 | |
632 <p>Now unmount and detach:</p> | |
633 | |
634 <pre><code># umount mount/ | |
635 # vnconfig -u vnd0</code></pre> | |
636 | |
637 <p>Now you can <a href="https://man.openbsd.org/dd.1">dd(1)</a> the imag… | |
638 | |
639 | |
640 <h2>Adding custom sets (optional)</h2> | |
641 | |
642 <p>For patching <a href="https://man.openbsd.org/rc.firsttime.8">/etc/rc… | |
643 system files it is useful to use a customized installation set like site… | |
644 The sets can even be specified per host/MAC address like: siteVERSION-$(… | |
645 example: site65-testvm.tgz</p> | |
646 | |
647 <p>When the installer checks the base sets of the mirror it looks for a … | |
648 To add custom sets the site entries have to be added.</p> | |
649 | |
650 <p>For example:</p> | |
651 <pre><code>-rw-r--r-- 1 1001 0 4538975 Oct 11 13:58:26 2018 site65-… | |
652 | |
653 <p>The filesize, permissions etc do not matter and are not checked by th… | |
654 Only the filename is matched by a regular expression.</p> | |
655 | |
656 | |
657 <h2>Sign custom site* tarball sets (optional)</h2> | |
658 | |
659 <p>If you have custom sets without creating a signed custom release you … | |
660 prompted for the messages:</p> | |
661 <pre><code>checksum test failed</code></pre> | |
662 <p>and:</p> | |
663 <pre><code>unverified sets: continue without verification</code></pre> | |
664 | |
665 <p>OpenBSD uses the program <a href="https://man.openbsd.org/signify.1">… | |
666 to cryptographically sign and verify filesets.</p> | |
667 | |
668 <p>To create a custom public/private keypair (ofcourse make sure to stor… | |
669 <pre><code>$ signify -G -n -c "Custom 6.5 install" -p custom-65-base.pub… | |
670 | |
671 <p>Create new checksum file with filelist of the current directory (exce… | |
672 <pre><code>$ printf '%s\n' * | grep -v SHA256 | xargs sha256 > SHA256… | |
673 | |
674 <p>Sign SHA256 and store as SHA256.sig, embed signature:</p> | |
675 <pre><code>$ signify -S -e -s /privatedir/custom-65-base.sec -m SHA256 -… | |
676 | |
677 <p>Verify the created signature and data is correct:</p> | |
678 <pre><code>$ signify -C -p /somelocation/custom-65-base.pub -x SHA256.si… | |
679 | |
680 <p>Copy <b>only</b> the <b>public</b> key to the RAMDISK:</p> | |
681 <pre><code>$ cp custom-65-base.pub mount/etc/signify/custom-65-base.pub<… | |
682 | |
683 <p>Now we have to patch the install.sub file to check our public key. | |
684 If you know a better way without having to patch this script, please let… | |
685 | |
686 <p>Change the variable PUB_KEY in the shellscript mount/install.sub from… | |
687 | |
688 <pre><code>PUB_KEY=/etc/signify/<b>openbsd</b>-${VERSION}-base.pub</code… | |
689 | |
690 <p>To:</p> | |
691 | |
692 <pre><code>PUB_KEY=/etc/signify/<b>custom</b>-${VERSION}-base.pub</code>… | |
693 | |
694 <p>And for upgrades from:</p> | |
695 | |
696 <pre><code>$UPGRADE_BSDRD && | |
697 PUB_KEY=/mnt/etc/signify/<b>openbsd</b>-$((VERSION + 1))-base.pu… | |
698 | |
699 <p>To:</p> | |
700 | |
701 <pre><code>$UPGRADE_BSDRD && | |
702 PUB_KEY=/mnt/etc/signify/<b>custom</b>-$((VERSION + 1))-base.pub… | |
703 | |
704 | |
705 <h2>Ideas</h2> | |
706 <ul> | |
707 <li>Patch <a href="https://man.openbsd.org/rc.firsttime.8">rc.firsttime(… | |
708 <li>Custom partitioning scheme, see <a href="https://man.openbsd.org/aut… | |
709 "URL to autopartitioning template for disklabel = url".</li> | |
710 <li>Setup <a href="https://man.openbsd.org/pxeboot.8">pxeboot(8)</a> to … | |
711 <a href="https://man.openbsd.org/dhcpd.8">dhcpd(8)</a> and <a href="… | |
712 then not even some USB stick is required.</li> | |
713 </ul> | |
714 | |
715 | |
716 <h2>References</h2> | |
717 <ul> | |
718 <li>Main OpenBSD installation and upgrade shellscript: <a href="https://… | |
719 </ul> | |
720 ]]></content> | |
721 </entry> | |
722 <entry> | |
723 <title type="text">Idiotbox: Youtube interface</title> | |
724 <link rel="alternate" type="text/html" href="https://www.codemad… | |
725 <id>https://www.codemadness.org/idiotbox.html</id> | |
726 <updated>2020-09-03T00:00:00Z</updated> | |
727 <published>2019-02-10T00:00:00Z</published> | |
728 <author> | |
729 <name>hiltjo</name> | |
730 <uri>https://www.codemadness.org</uri> | |
731 </author> | |
732 <summary type="text">Idiotbox: Youtube interface</summary> | |
733 <content type="html"><![CDATA[<h1>Idiotbox: Youtube interface</h… | |
734 <p><strong>Last modification on </strong> <time>2020-09-03</time… | |
735 <p> | |
736 Idiotbox is a less resource-heavy Youtube interface. | |
737 For viewing videos it is recommended to use it with | |
738 <a href="https://mpv.io/">mpv</a> + | |
739 <a href="https://rg3.github.io/youtube-dl/">youtube-dl</a>. | |
740 </p> | |
741 | |
742 <p>For more (up-to-date) information see the <a href="/git/frontends/fil… | |
743 | |
744 | |
745 <h2>Why</h2> | |
746 <p> | |
747 In my opinion the standard Youtube web interface is: | |
748 </p> | |
749 <ul> | |
750 <li>Non-intuitive, too much visual crap.</li> | |
751 <li>Too resource-hungry, both in CPU and bandwidth.</li> | |
752 <li>Doesn't work well on simpler (text-based) browsers such as n… | |
753 </ul> | |
754 | |
755 | |
756 <h2>Features</h2> | |
757 <ul> | |
758 <li>Doesn't use JavaScript.</li> | |
759 <li>Doesn't use (tracking) cookies.</li> | |
760 <li>CSS is optional.</li> | |
761 <li>Multiple interfaces available: CGI web, CLI, gopher (gph), t… | |
762 <li>Doesn't use or require the Google API.</li> | |
763 <li>CGI interface works nice in most browsers, including text-ba… | |
764 <li>On OpenBSD it runs "sandboxed" and it can be compiled as a s… | |
765 <a href="https://man.openbsd.org/pledge">pledge(2)</a>, | |
766 <a href="https://man.openbsd.org/unveil">unveil(2)</a> in a … | |
767 </ul> | |
768 | |
769 | |
770 <h2>Cons</h2> | |
771 <ul> | |
772 <li>Order by upload date is incorrect (same as on Youtube).</li> | |
773 <li>Some Youtube features are not supported.</li> | |
774 <li>Uses scraping so might break at any point.</li> | |
775 </ul> | |
776 | |
777 | |
778 <h2>Clone</h2> | |
779 <pre><code>git clone git://<a href="//git.codemadness.org/frontends/">gi… | |
780 | |
781 | |
782 <h2>Download releases</h2> | |
783 <p> | |
784 Releases are available at: | |
785 <a href="/releases/frontends/">https://codemadness.org/releases/frontend… | |
786 </p> | |
787 | |
788 | |
789 <h2>View</h2> | |
790 <p> | |
791 <a href="https://codemadness.org/idiotbox/">You can view it here</a>. | |
792 </p> | |
793 | |
794 <p> | |
795 <a href="https://codemadness.org/idiotbox/?q=gunther+tralala">Search exa… | |
796 </p> | |
797 ]]></content> | |
798 </entry> | |
799 <entry> | |
800 <title type="text">Gopher HTTP proxy</title> | |
801 <link rel="alternate" type="text/html" href="https://www.codemad… | |
802 <id>https://www.codemadness.org/gopher-proxy.html</id> | |
803 <updated>2020-08-30T00:00:00Z</updated> | |
804 <published>2018-08-17T00:00:00Z</published> | |
805 <author> | |
806 <name>hiltjo</name> | |
807 <uri>https://www.codemadness.org</uri> | |
808 </author> | |
809 <summary type="text">Gopher HTTP proxy</summary> | |
810 <content type="html"><![CDATA[<h1>Gopher HTTP proxy</h1> | |
811 <p><strong>Last modification on </strong> <time>2020-08-30</time… | |
812 <p> | |
813 For fun I wrote a small HTTP Gopher proxy CGI program in C. It only supp… | |
814 the basic Gopher types and has some restrictions to prevent some abuse. | |
815 </p> | |
816 | |
817 <p> | |
818 For your regular Gopher browsing I recommend the simple Gopher client | |
819 <a href="https://git.fifth.space/sacc/">sacc</a>. | |
820 </p> | |
821 | |
822 <p> | |
823 For more information about Gopher check out the gopherhole: | |
824 <a href="http://gopherproject.org/">gopherproject.org</a>. | |
825 </p> | |
826 | |
827 | |
828 <h2>Clone</h2> | |
829 <pre><code>git clone git://<a href="//git.codemadness.org/gopherproxy-c/… | |
830 | |
831 | |
832 <h2>View</h2> | |
833 <p> | |
834 <a href="https://codemadness.org/gopherproxy/">You can view it here</a>. | |
835 </p> | |
836 | |
837 <p> | |
838 <a href="/gopherproxy/?q=codemadness.org">My gopherhole using the proxy.… | |
839 </p> | |
840 ]]></content> | |
841 </entry> | |
842 <entry> | |
843 <title type="text">Setup your own file paste service</title> | |
844 <link rel="alternate" type="text/html" href="https://www.codemad… | |
845 <id>https://www.codemadness.org/paste-service.html</id> | |
846 <updated>2018-03-10T00:00:00Z</updated> | |
847 <published>2018-03-10T00:00:00Z</published> | |
848 <author> | |
849 <name>hiltjo</name> | |
850 <uri>https://www.codemadness.org</uri> | |
851 </author> | |
852 <summary type="text">Howto setup your own secure file paste serv… | |
853 <content type="html"><![CDATA[<h1>Setup your own file paste serv… | |
854 <p><strong>Last modification on </strong> <time>2018-03-10</time… | |
855 <h2 id="SSH">Setup SSH authentication</h2> | |
856 | |
857 <p>Make sure to setup SSH public key authentication so you don't need to… | |
858 a password each time and have a more secure authentication.</p> | |
859 | |
860 <p>For example in the file $HOME/.ssh/config:</p> | |
861 | |
862 <pre><code>Host codemadness | |
863 Hostname codemadness.org | |
864 Port 22 | |
865 IdentityFile ~/.ssh/codemadness/id_rsa | |
866 </code></pre> | |
867 | |
868 <p>Of course also make sure to generate the private and public keys.</p> | |
869 | |
870 | |
871 <h2 id="alias">Shell alias</h2> | |
872 | |
873 <p>Make an alias or function in your shell config:</p> | |
874 <pre><code>pastesrv() { | |
875 ssh user@codemadness "cat > /home/www/domains/codemadness.org/ht… | |
876 echo "https://codemadness.org/paste/$1" | |
877 }</code></pre> | |
878 | |
879 <p> | |
880 This function reads any data from stdin and transfers the output securel… | |
881 SSH and writes it to a file at the specified path. This path can be visi… | |
882 HTTP, gopher or an other protocol. Then it writes the absolute url to st… | |
883 this url can be copied to the clipboard and pasted anywhere like to an e… | |
884 IRC etc. | |
885 </p> | |
886 | |
887 | |
888 <h2 id="usage">Usage and examples</h2> | |
889 | |
890 <p>To use it, here are some examples:</p> | |
891 | |
892 <p>Create a patch of the last commit in the git repo and store it:</p> | |
893 <pre><code>git format-patch --stdout HEAD^ | pastesrv 'somepatch.diff'</… | |
894 | |
895 <p>Create a screenshot of your current desktop and paste it:</p> | |
896 <pre><code>xscreenshot | ff2png | pastesrv 'screenshot.png'</code></pre> | |
897 | |
898 <p>There are many other uses of course, use your imagination :)</p> | |
899 ]]></content> | |
900 </entry> | |
901 <entry> | |
902 <title type="text">Setup your own git hosting service</title> | |
903 <link rel="alternate" type="text/html" href="https://www.codemad… | |
904 <id>https://www.codemadness.org/setup-git-hosting.html</id> | |
905 <updated>2019-12-06T00:00:00Z</updated> | |
906 <published>2018-02-25T00:00:00Z</published> | |
907 <author> | |
908 <name>hiltjo</name> | |
909 <uri>https://www.codemadness.org</uri> | |
910 </author> | |
911 <summary type="text">Howto setup your own git hosting service</s… | |
912 <content type="html"><![CDATA[<h1>Setup your own git hosting ser… | |
913 <p><strong>Last modification on </strong> <time>2019-12-06</time… | |
914 <p> | |
915 <strong>This article assumes you use OpenBSD for the service files and O… | |
916 </p> | |
917 | |
918 | |
919 <h2>Why</h2> | |
920 | |
921 <p>A good reason to host your own git repositories is because of having … | |
922 over your own computing. | |
923 Assuming your hosting is secure you can be sure noone tampers with the d… | |
924 | |
925 <p>A particular disturbing example was | |
926 <a href="https://en.wikipedia.org/wiki/SourceForge#Controversies">the So… | |
927 <br/> | |
928 <a href="https://gitlab.com/gitlab-org/gitaly/issues/2113">As of 2019-10… | |
929 <a href="https://about.gitlab.com/blog/2019/10/10/update-free-software-a… | |
930 </p> | |
931 | |
932 <p>The same thing can happen with Github, Bitbucket or other similar ser… | |
933 After all: they are just a company with commercial interests.</p> | |
934 | |
935 <p>Always make sure you truly own the software and can host it yourself,… | |
936 in control.</p> | |
937 | |
938 <p>These online services also have different pricing plans and various | |
939 (arbitrary) restrictions. When you host it yourself the restrictions ar… | |
940 resource limits of the system and your connection, therefore it is a muc… | |
941 flexible solution.</p> | |
942 | |
943 | |
944 <h2>Creating repositories</h2> | |
945 | |
946 <p>For the hosting it is recommended to use a so-called "bare" repositor… | |
947 A bare repository means no files are checked out in the folder itself. | |
948 To create a bare repository use git init with the --bare argument:</p> | |
949 | |
950 <pre><code>$ git init --bare</code></pre> | |
951 | |
952 <p>I recommend to create a separate user and group for the source-code r… | |
953 In the examples we will assume the user is called "src".</p> | |
954 | |
955 <p>Login as the src user and create the files. To create a directory for | |
956 the repos, in this example /home/src/src:</p> | |
957 | |
958 <pre><code>$ mkdir -p /home/src/src | |
959 $ cd /home/src/src | |
960 $ git init --bare someproject | |
961 $ $EDITOR someproject/description</code></pre> | |
962 | |
963 <p>Make sure the git-daemon process has access permissions to these repo… | |
964 | |
965 | |
966 <h2>Install git-daemon (optional)</h2> | |
967 | |
968 <p>Using git-daemon you can clone the repositories publicly using the ef… | |
969 git:// protocol. An alternative without having to use git-daemon is by u… | |
970 HTTPS or any public shared filesystem.</p> | |
971 | |
972 <p>When you use a private-only repository I recommend to just use SSH wi… | |
973 git-daemon because it is secure.</p> | |
974 | |
975 <p>Install the git package. The package should contain "git daemon":</p> | |
976 <pre><code># pkg_add git</code></pre> | |
977 | |
978 <p>Enable the daemon:</p> | |
979 <pre><code># rcctl enable gitdaemon</code></pre> | |
980 | |
981 <p>Set the gitdaemon service flags to use the src directory and use all … | |
982 repositories in this directory. The command-line flags "--export-all" ex… | |
983 repositories in the base path. Alternatively you can use the "git-daemon… | |
984 file (see the git-daemon man page). | |
985 </p> | |
986 | |
987 <pre><code># rcctl set gitdaemon flags --export-all --base-path="/home/s… | |
988 | |
989 <p>To configure the service to run as the user _gitdaemon:</p> | |
990 <pre><code># rcctl set gitdaemon user _gitdaemon</code></pre> | |
991 | |
992 <p>To run the daemon directly as the user _gitdaemon (without dropping p… | |
993 to the user) set the following flags in /etc/rc.d/gitdaemon:</p> | |
994 <pre><code>daemon_flags="--user=_gitdaemon"</code></pre> | |
995 | |
996 <p>Which will also avoid this warning while cloning:</p> | |
997 <pre><code>"can't access /root/.git/config"</code></pre> | |
998 | |
999 | |
1000 <p>Now start the daemon:</p> | |
1001 <pre><code># rcctl start gitdaemon</code></pre> | |
1002 | |
1003 | |
1004 <h2>Cloning and fetching changes</h2> | |
1005 | |
1006 <p>To test and clone the repository do:</p> | |
1007 <pre><code>$ git clone git://yourdomain/someproject</code></pre> | |
1008 | |
1009 <p>if you skipped the optional git-daemon installation then just clone v… | |
1010 <pre><code>$ git clone ssh://youraccount@yourdomain:/home/src/src/somepr… | |
1011 | |
1012 <p>When cloning via SSH make sure to setup private/public key authentica… | |
1013 and convenience.</p> | |
1014 | |
1015 | |
1016 <h2>Pushing changes</h2> | |
1017 | |
1018 <p>Add the repository as a remote:</p> | |
1019 <pre><code>$ git remote add myremote ssh://youraccount@yourdomain:/home/… | |
1020 | |
1021 <p>Then push the changes:</p> | |
1022 <pre><code>$ git push myremote master:master</code></pre> | |
1023 | |
1024 | |
1025 <h2>Git history web browsing (optional)</h2> | |
1026 | |
1027 <p>Sometimes it's nice to browse the git history log of the repository i… | |
1028 web browser or some other program without having to look at the local | |
1029 repository.</p> | |
1030 | |
1031 <ul> | |
1032 <li><a href="stagit.html">Stagit</a> is a static HTML page gener… | |
1033 <li><a href="stagit-gopher.html">Stagit-gopher</a> is a static p… | |
1034 <a href="http://gopherproject.org/">gopher</a> and | |
1035 <a href="gopher://bitreich.org/1/scm/geomyidae">geomyida… | |
1036 <li>cgit is a CGI-based program which shows HTML views of your r… | |
1037 see also the page: <a href="openbsd-httpd-and-cgit.html"… | |
1038 </ul> | |
1039 | |
1040 <p>It's also possible with these tools to generate an Atom feed and then… | |
1041 to track the git history:</p> | |
1042 | |
1043 <ul> | |
1044 <li>An example url from cgit: | |
1045 <a href="https://git.kernel.org/pub/scm/linux/kernel/git/stable/… | |
1046 | |
1047 <li>An example url from stagit: | |
1048 <a href="//git.codemadness.org/www.codemadness.org/atom.xml">www… | |
1049 </ul> | |
1050 | |
1051 <p> | |
1052 My <a href="sfeed-simple-feed-parser.html">sfeed</a> program can be used… | |
1053 </p> | |
1054 | |
1055 | |
1056 <h2>Setting up git hooks (optional)</h2> | |
1057 | |
1058 <p> | |
1059 Using git hooks you can setup automated triggers, for example when pushi… | |
1060 Some useful examples can be: | |
1061 </p> | |
1062 | |
1063 <ul> | |
1064 <li><a href="/git/stagit/file/example_post-receive.sh.html">For | |
1065 stagit: update the repo files (example post-receive hook… | |
1066 <li>Send an e-mail with the commit subject and message.</li> | |
1067 <li>Log/notify commits and changes to an IRC channel using | |
1068 <a href="https://tools.suckless.org/ii/">ii</a>.</li> | |
1069 <li>Create a release tarball and checksum file on a tag push/cha… | |
1070 <li>Checkout files for website content.</li> | |
1071 </ul> | |
1072 | |
1073 | |
1074 <p>I hope this is useful. Have fun.</p> | |
1075 ]]></content> | |
1076 </entry> | |
1077 <entry> | |
1078 <title type="text">Setup an OpenBSD SPARC64 VM in QEMU</title> | |
1079 <link rel="alternate" type="text/html" href="https://www.codemad… | |
1080 <id>https://www.codemadness.org/openbsd-sparc64-vm.html</id> | |
1081 <updated>2020-04-18T00:00:00Z</updated> | |
1082 <published>2017-12-11T00:00:00Z</published> | |
1083 <author> | |
1084 <name>hiltjo</name> | |
1085 <uri>https://www.codemadness.org</uri> | |
1086 </author> | |
1087 <summary type="text">Setup an OpenBSD SPARC64 VM in QEMU</summar… | |
1088 <content type="html"><![CDATA[<h1>Setup an OpenBSD SPARC64 VM in… | |
1089 <p><strong>Last modification on </strong> <time>2020-04-18</time… | |
1090 <p>This describes how to setup an OpenBSD SPARC64 VM in QEMU.</p> | |
1091 | |
1092 | |
1093 <h2>Create a disk image</h2> | |
1094 <p>To create a 5GB disk image:</p> | |
1095 <pre><code>qemu-img create -f qcow2 fs.qcow2 5G</code></pre> | |
1096 | |
1097 | |
1098 <h2>Install</h2> | |
1099 <p>In this guide we'll use the installation ISO to install OpenBSD. Make… | |
1100 to download the latest (stable) OpenBSD ISO, for example install62.iso.<… | |
1101 | |
1102 <ul> | |
1103 <li>Change -boot c to -boot d to boot from the CD-ROM and do a c… | |
1104 <li>Change -cdrom install62.iso to the location of your ISO file… | |
1105 <li>When the install is done type: halt -p</li> | |
1106 <li>Change -boot d back to -boot c.</li> | |
1107 </ul> | |
1108 | |
1109 <p>Start the VM:</p> | |
1110 | |
1111 <pre><code>#!/bin/sh | |
1112 LC_ALL=C QEMU_AUDIO_DRV=none \ | |
1113 qemu-system-sparc64 \ | |
1114 -machine sun4u,usb=off \ | |
1115 -realtime mlock=off \ | |
1116 -smp 1,sockets=1,cores=1,threads=1 \ | |
1117 -rtc base=utc \ | |
1118 -m 1024 \ | |
1119 -boot c \ | |
1120 -drive file=fs.qcow2,if=none,id=drive-ide0-0-1,format=qcow2,cach… | |
1121 -cdrom install62.iso \ | |
1122 -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-1,id=ide0-0-1… | |
1123 -msg timestamp=on \ | |
1124 -serial pty -nographic \ | |
1125 -net nic,model=ne2k_pci -net user | |
1126 </code></pre> | |
1127 | |
1128 <p>The VM has the following properties:</p> | |
1129 <ul> | |
1130 <li>No audio.</li> | |
1131 <li>No USB.</li> | |
1132 <li>No VGA graphics: serial console.</li> | |
1133 <li>Netdev is ne0 (Realtek 8029).</li> | |
1134 <li>1024MB memory.</li> | |
1135 </ul> | |
1136 | |
1137 <p>From your host connect to the serial device indicated by QEMU, for ex… | |
1138 <pre><code>(qemu) 2017-11-19T15:14:20.884312Z qemu-system-sparc64: -seri… | |
1139 | |
1140 <p>Then you can use the serial terminal emulator <strong>cu</strong> to … | |
1141 <pre><code>cu -l <strong>/dev/ttyp0</strong></code></pre> | |
1142 | |
1143 <p>Another option could be using the <a href="https://git.suckless.org/s… | |
1144 <pre><code>st -l <strong>/dev/ttyp0</strong></code></pre> | |
1145 | |
1146 <p>using cu to detach the <a href="https://man.openbsd.org/cu#~^D">cu(1)… | |
1147 | |
1148 <pre><code>Typed characters are normally transmitted directly to the rem… | |
1149 does the echoing as well). A tilde ('~') appearing as the first charact… | |
1150 line is an escape signal; the following are recognized: | |
1151 | |
1152 ~^D or ~. Drop the connection and exit. Only the connection is | |
1153 the login session is not terminated.</code></pre> | |
1154 | |
1155 <p>On boot you have to type:</p> | |
1156 | |
1157 <pre><code>root device: <strong>wd0a</strong> | |
1158 for swap use the default (wd0b) <strong>Press enter</strong></code></pre> | |
1159 | |
1160 | |
1161 <h2>Initial settings on first boot (optional)</h2> | |
1162 | |
1163 <p>Automatic network configuration using DHCP</p> | |
1164 <pre><code>echo "dhcp" > /etc/hostname.ne0</code></pre> | |
1165 | |
1166 <p>To bring up the interface (will be automatic on the next boot):</p> | |
1167 <pre><code>sh /etc/netstart</code></pre> | |
1168 | |
1169 <p>Add a mirror to /etc/installurl for package installation. Make sure t… | |
1170 the most efficient/nearby mirror site on the OpenBSD mirror page.</p> | |
1171 <pre><code>echo "https://ftp.hostserver.de/pub/OpenBSD" > /etc/installur… | |
1172 | |
1173 | |
1174 <p>I hope this is useful. Have fun.</p> | |
1175 ]]></content> | |
1176 </entry> | |
1177 <entry> | |
1178 <title type="text">Tscrape: a Twitter scraper</title> | |
1179 <link rel="alternate" type="text/html" href="https://www.codemad… | |
1180 <id>https://www.codemadness.org/tscrape.html</id> | |
1181 <updated>2020-07-20T00:00:00Z</updated> | |
1182 <published>2017-09-24T00:00:00Z</published> | |
1183 <author> | |
1184 <name>hiltjo</name> | |
1185 <uri>https://www.codemadness.org</uri> | |
1186 </author> | |
1187 <summary type="text">Tscrape: a Twitter scraper</summary> | |
1188 <content type="html"><![CDATA[<h1>Tscrape: a Twitter scraper</h1> | |
1189 <p><strong>Last modification on </strong> <time>2020-07-20</time… | |
1190 <p>Tscrape is a Twitter web scraper and archiver.</p> | |
1191 | |
1192 <p>Twitter removed the functionality to follow users using a RSS feed wi… | |
1193 authenticating or using their API. With this program you can format twee… | |
1194 any way you like relatively anonymously.</p> | |
1195 | |
1196 <p>For more (up-to-date) information see the <a href="/git/tscrape/file/… | |
1197 | |
1198 | |
1199 <h2>Clone</h2> | |
1200 <pre><code>git clone git://<a href="//git.codemadness.org/tscrape/">git.… | |
1201 | |
1202 | |
1203 <h2>Download releases</h2> | |
1204 <p> | |
1205 Releases are available at: | |
1206 <a href="/releases/tscrape/">https://codemadness.org/releases/tscrape/</… | |
1207 </p> | |
1208 | |
1209 | |
1210 <h2>Examples</h2> | |
1211 <p>Output format examples</p> | |
1212 | |
1213 <ul> | |
1214 <li><a href="tscrape/tscrape_html.html">tscrape_html: HTML</a></li> | |
1215 <li><a href="tscrape/tscrape_plain.txt">tscrape_plain: Text</a></li> | |
1216 </ul> | |
1217 ]]></content> | |
1218 </entry> | |
1219 <entry> | |
1220 <title type="text">jsdatatable: a small datatable Javascript</ti… | |
1221 <link rel="alternate" type="text/html" href="https://www.codemad… | |
1222 <id>https://www.codemadness.org/datatable.html</id> | |
1223 <updated>2020-07-20T00:00:00Z</updated> | |
1224 <published>2017-09-24T00:00:00Z</published> | |
1225 <author> | |
1226 <name>hiltjo</name> | |
1227 <uri>https://www.codemadness.org</uri> | |
1228 </author> | |
1229 <summary type="text">jsdatatable: a small datatable Javascript</… | |
1230 <content type="html"><![CDATA[<h1>jsdatatable: a small datatable… | |
1231 <p><strong>Last modification on </strong> <time>2020-07-20</time… | |
1232 <p>This is a small datatable Javascript with no dependencies.</p> | |
1233 | |
1234 | |
1235 <h2>Features</h2> | |
1236 | |
1237 <ul> | |
1238 <li>Small: | |
1239 <ul> | |
1240 <li>Filesize: +- 9.1KB.</li> | |
1241 <li>Lines: +- 300, not much code, so hopefully easy to u… | |
1242 <li>No dependencies on other libraries like jQuery.</li> | |
1243 </ul> | |
1244 </li> | |
1245 <li>Sorting on columns, multi-column support with shift-click.</li> | |
1246 <li>Filtering values: case-insensitively, tokenized (separated by space)… | |
1247 <li>Able to add custom filtering, parsing and sorting functions.</li> | |
1248 <li>Helper function for delayed (150ms) filtering, so filtering feels mo… | |
1249 responsive for big datasets.</li> | |
1250 <li>Permissive ISC license, see LICENSE file.</li> | |
1251 <li>"Lazy scroll" mode: | |
1252 <ul> | |
1253 <li>fixed column headers and renders only visible rows, … | |
1254 "lazily" render millions of rows.</li> | |
1255 </ul> | |
1256 </li> | |
1257 <li>Officially supported browsers are: | |
1258 <ul> | |
1259 <li>Firefox and Firefox ESR.</li> | |
1260 <li>Chrome and most recent webkit-based browsers.</li> | |
1261 <li>IE10+.</li> | |
1262 </ul> | |
1263 </li> | |
1264 </ul> | |
1265 | |
1266 | |
1267 <h2>Why? and a comparison</h2> | |
1268 | |
1269 <p> | |
1270 It was created because all the other datatable scripts suck balls. | |
1271 </p> | |
1272 | |
1273 <p> | |
1274 Most Javascripts nowadays have a default dependency on jQuery, Bootstrap… | |
1275 </p> | |
1276 | |
1277 <p> | |
1278 jQuery adds about 97KB and Bootstrap adds about 100KB to your scripts an… | |
1279 This increases the CPU, memory and bandwidth consumption and latency. It… | |
1280 complexity to your scripts. | |
1281 </p> | |
1282 | |
1283 <p> | |
1284 jQuery was mostly used for backwards-compatibility in the Internet Explo… | |
1285 most often not needed anymore. It contains functionality to query the DO… | |
1286 selectors, but this is now supported with for example document.querySele… | |
1287 Functionality like a JSON parser is standard available now: JSON.parse(). | |
1288 </p> | |
1289 | |
1290 | |
1291 <h3>Size comparison</h3> | |
1292 | |
1293 <p>All sizes are not "minified" or gzipped.</p> | |
1294 | |
1295 <table class="datatable"> | |
1296 <thead> | |
1297 <tr> | |
1298 <th>Name</th> | |
1299 <th class="a-r" data-parse="int">Total</th> | |
1300 <th class="a-r" data-parse="int">JS</th> | |
1301 <th class="a-r" data-parse="int">CSS</th> | |
1302 <th class="a-r" data-parse="int">Images</th> | |
1303 <th class="a-r" data-parse="int">jQuery</th> | |
1304 </tr> | |
1305 </thead> | |
1306 <tbody> | |
1307 <tr> | |
1308 <td><a href="/git/jscancer/">jsdatatable</a></td> | |
1309 <td class="a-r g" data-value="12900">12.9KB</td> | |
1310 <td class="a-r g" data-value="9100">9.1KB</td> | |
1311 <td class="a-r g" data-value="2500">2.5KB</td> | |
1312 <td class="a-r g" data-value="1300">1.3KB</td> | |
1313 <td class="a-r g" data-value="0">-</td> | |
1314 </tr> | |
1315 <tr> | |
1316 <td><a href="https://datatables.net/">datatables.net</a> (withou… | |
1317 <td class="a-r r" data-value="563400">563.4KB</td> | |
1318 <td class="a-r r" data-value="449300">449.3KB</td> | |
1319 <td class="a-r r" data-value="16000">16KB</td> | |
1320 <td class="a-r g" data-value="800">0.8KB</td> | |
1321 <td class="a-r r" data-value="97300">97.3KB</td> | |
1322 </tr> | |
1323 <tr> | |
1324 <td><a href="https://plugins.jquery.com/jdatatable/">jdatatable<… | |
1325 <td class="a-r r" data-value="154600">154.6KB</td> | |
1326 <td class="a-r r" data-value="53000">53KB</td> | |
1327 <td class="a-r g" data-value="1000">1KB</td> | |
1328 <td class="a-r g" data-value="3300">3.3KB</td> | |
1329 <td class="a-r r" data-value="97300">97.3KB</td> | |
1330 </tr> | |
1331 </tbody> | |
1332 </table> | |
1333 | |
1334 <p> | |
1335 Of course jsdatatable has less features (less is more!), but it does 90%… | |
1336 Because it is so small it is also much simpler understand and extend wit… | |
1337 if needed. | |
1338 </p> | |
1339 | |
1340 <p> | |
1341 See also: <a href="http://idlewords.com/talks/website_obesity.htm">The w… | |
1342 </p> | |
1343 | |
1344 | |
1345 <h2>Clone</h2> | |
1346 | |
1347 <pre><code>git clone git://<a href="//git.codemadness.org/jscancer/">git… | |
1348 <p> | |
1349 It is in the datatable directory. | |
1350 </p> | |
1351 | |
1352 | |
1353 <h2>Download releases</h2> | |
1354 <p> | |
1355 Releases are available at: | |
1356 <a href="/releases/jscancer/">https://codemadness.org/releases/jscancer/… | |
1357 </p> | |
1358 | |
1359 | |
1360 <h2>Usage</h2> | |
1361 | |
1362 <h3>Examples</h3> | |
1363 | |
1364 <p> | |
1365 See example.html for an example. A stylesheet file datatable.css is also | |
1366 included, it contains the icons as embedded images. | |
1367 </p> | |
1368 | |
1369 <p> | |
1370 A table should have the classname "datatable" set, it must contain a <… | |
1371 for the column headers (<td> or <th>) and <tbody> elem… | |
1372 minimal code needed for a working datatable: | |
1373 </p> | |
1374 | |
1375 <pre><code><html> | |
1376 <body> | |
1377 <input class="filter-text" /><!-- optional --> | |
1378 <table class="datatable"> | |
1379 <thead><!-- columns --> | |
1380 <tr><td>Click me</td></tr> | |
1381 </thead> | |
1382 <tbody><!-- data --> | |
1383 <tr><td>a</td></tr> | |
1384 <tr><td>b</td></tr> | |
1385 </tbody> | |
1386 </table> | |
1387 <script type="text/javascript" src="datatable.js"></script> | |
1388 <script type="text/javascript">var datatables = datatable_autoload… | |
1389 </body> | |
1390 </html> | |
1391 </code></pre> | |
1392 | |
1393 | |
1394 <h3>Column attributes</h3> | |
1395 | |
1396 <p> | |
1397 The following column attributes are supported: | |
1398 </p> | |
1399 | |
1400 <table class="datatable"> | |
1401 <thead> | |
1402 <tr> | |
1403 <th>Attribute name</th> | |
1404 <th>Description</th> | |
1405 </tr> | |
1406 </thead> | |
1407 <tbody> | |
1408 <tr> | |
1409 <td>data-filterable</td> | |
1410 <td>If "1" or "true" specifies if the column can be filtered, | |
1411 default: "true".</td> | |
1412 </tr> | |
1413 <tr> | |
1414 <td>data-parse</td> | |
1415 <td>Specifies how to parse the values, default: "string", | |
1416 which is datatable_parse_string(). See PARSING section | |
1417 below.</td> | |
1418 </tr> | |
1419 <tr> | |
1420 <td>data-sort</td> | |
1421 <td>Specifies how to sort the values: default: "default", | |
1422 which is datatable_sort_default(). See SORTING section | |
1423 below.</td> | |
1424 </tr> | |
1425 <tr> | |
1426 <td>data-sortable</td> | |
1427 <td>If "1" or "true" specifies if the column can be sorted, | |
1428 default: "true".</td> | |
1429 </tr> | |
1430 </tbody> | |
1431 </table> | |
1432 | |
1433 | |
1434 <h3>Parsing</h3> | |
1435 | |
1436 <p> | |
1437 By default only parsing for the types: date, float, int and string are | |
1438 supported, but other types can be easily added as a function with the na… | |
1439 datatable_parse_<typename>(). The parse functions parse the data-v… | |
1440 attribute when set or else the cell content (in order). Because of this | |
1441 behaviour you can set the actual values as the data-value attribute and … | |
1442 the cell content for display. This is useful to display and properly sort | |
1443 locale-aware currency, datetimes etc. | |
1444 </p> | |
1445 | |
1446 | |
1447 <h3>Filtering</h3> | |
1448 | |
1449 <p> | |
1450 Filtering will be done case-insensitively on the cell content and when s… | |
1451 on the data-value attribute. The filter string is split up as tokens sep… | |
1452 by space. Each token must match atleast once per row to display it. | |
1453 </p> | |
1454 | |
1455 | |
1456 <h3>Sorting</h3> | |
1457 | |
1458 <p> | |
1459 Sorting is done on the parsed values by default with the function: | |
1460 datatable_sort_default(). To change this you can set a customname string… | |
1461 the data-sort attribute on the column which translates to the function: | |
1462 datatable_sort_<customname>(). | |
1463 </p> | |
1464 | |
1465 <p> | |
1466 In some applications locale values are used, like for currency, decimal … | |
1467 datetimes. Some people also like to use icons or extended HTML elements … | |
1468 the cell. Because jsdatatable sorts on the parsed value (see section PAR… | |
1469 it is possible to sort on the data-value attribute values and use the ce… | |
1470 content for display. | |
1471 </p> | |
1472 | |
1473 <p>For example:</p> | |
1474 | |
1475 <p> | |
1476 currency, decimal numbers: | |
1477 use data-value attribute with floating-point number, set data-pa… | |
1478 column to "float". | |
1479 date/datetimes: | |
1480 use data-value attribute with UNIX timestamps (type int), set | |
1481 data-parse on column to "int" or set the data-parse attribute on | |
1482 column to "date" which is datatable_parse_date(), then make sure… | |
1483 use Zulu times, like: "2016-01-01T01:02:03Z" or other | |
1484 time strings that are parsable as the data-value attribute. | |
1485 icons: | |
1486 generally use data-value attribute with integer as weight value … | |
1487 on, set data-parse column to "int". | |
1488 </p> | |
1489 | |
1490 | |
1491 <h3>Dynamically update data</h3> | |
1492 <p> | |
1493 To update data dynamically see example-ajax.html for an example how to d… | |
1494 </p> | |
1495 | |
1496 | |
1497 <h3>Caveats</h3> | |
1498 <ul> | |
1499 <li>A date, integer, float or other values must be able to parse properl… | |
1500 the parse function returns NaN, null or undefined etc. the sorting beh… | |
1501 is also undefined. It is recommended to always set a zero value for ea… | |
1502 type.</li> | |
1503 <li><tfoot> is not supported in datatables in "lazy" mode.</li> | |
1504 </ul> | |
1505 | |
1506 | |
1507 <h2>Demo / example</h2> | |
1508 | |
1509 <noscript> | |
1510 <p> | |
1511 <strong>For the below example to work you need to have Javascript enable… | |
1512 </p> | |
1513 </noscript> | |
1514 | |
1515 <p> | |
1516 <a href="datatable-example.html">datatable-example.html</a> | |
1517 </p> | |
1518 | |
1519 <link rel="stylesheet" type="text/css" href="datatable.css" /> | |
1520 <style type="text/css"> | |
1521 th { text-align: left; } | |
1522 .a-r { text-align: right; } | |
1523 .no-stock { background-color: #ffcccc !important; } | |
1524 .r { background-color: #ffcccc !important; } | |
1525 .g { background-color: #ccffcc !important; } | |
1526 | |
1527 /* @media (prefers-color-scheme: dark) { | |
1528 .r { background-color: #700 !important; } | |
1529 .g { background-color: #070 !important; } | |
1530 }*/ | |
1531 </style> | |
1532 ]]></content> | |
1533 </entry> | |
1534 <entry> | |
1535 <title type="text">Stagit-gopher: a static git page generator fo… | |
1536 <link rel="alternate" type="text/html" href="https://www.codemad… | |
1537 <id>https://www.codemadness.org/stagit-gopher.html</id> | |
1538 <updated>2020-07-20T00:00:00Z</updated> | |
1539 <published>2017-08-04T00:00:00Z</published> | |
1540 <author> | |
1541 <name>hiltjo</name> | |
1542 <uri>https://www.codemadness.org</uri> | |
1543 </author> | |
1544 <summary type="text">a static git page generator for gopher</sum… | |
1545 <content type="html"><![CDATA[<h1>Stagit-gopher: a static git pa… | |
1546 <p><strong>Last modification on </strong> <time>2020-07-20</time… | |
1547 <p> | |
1548 stagit-gopher is a static page generator for Gopher. | |
1549 It creates the pages as static <a href="http://git.r-36.net/geomyidae/">… | |
1550 stagit-gopher is a modified version from the HTML version of stagit. | |
1551 </p> | |
1552 | |
1553 <p> | |
1554 <a href="/git/stagit-gopher/file/README.html">Read the README for more i… | |
1555 </p> | |
1556 | |
1557 <p> | |
1558 I also run a gopherhole and stagit-gopher, you can see how it looks here: | |
1559 <a href="gopher://codemadness.org/">gopher://codemadness.org/</a>. | |
1560 </p> | |
1561 | |
1562 <p> | |
1563 <a href="https://git.fifth.space/sacc/log.html">sacc</a> is a good Gophe… | |
1564 </p> | |
1565 | |
1566 | |
1567 <h2>Features</h2> | |
1568 <ul> | |
1569 <li>Log of all commits from HEAD.</li> | |
1570 <li>Log and diffstat per commit.</li> | |
1571 <li>Show file tree with line numbers.</li> | |
1572 <li>Show references: local branches and tags.</li> | |
1573 <li>Detect README and LICENSE file from HEAD and link it as a webpage.</… | |
1574 <li>Detect submodules (.gitmodules file) from HEAD and link it as a webp… | |
1575 <li>Atom feed log (atom.xml).</li> | |
1576 <li>Make index page for multiple repositories with stagit-gopher-index.<… | |
1577 <li>After generating the pages (relatively slow) serving the files is ve… | |
1578 simple and requires little resources (because the content is static)… | |
1579 <a href="http://git.r-36.net/geomyidae/">geomyidae</a> Gopher server… | |
1580 <li>Security: all pages are static. No CGI or dynamic code is run for th… | |
1581 Using it with a secure Gopher server such as | |
1582 <a href="http://git.r-36.net/geomyidae/">geomyidae</a> it is privile… | |
1583 <li>Simple to setup: the content generation is clearly separated from se… | |
1584 and scripts.</li> | |
1585 <li>Usable with Gopher clients such as lynx and | |
1586 <a href="https://git.fifth.space/sacc/log.html">sacc</a>. | |
1587 </li> | |
1588 </ul> | |
1589 | |
1590 | |
1591 <h2>Cons</h2> | |
1592 <ul> | |
1593 <li>Not suitable for large repositories (2000+ commits), because diffsta… | |
1594 an expensive operation, the cache (-c flag) is a workaround for this… | |
1595 some cases.</li> | |
1596 <li>Not suitable for large repositories with many files, because all fil… | |
1597 written for each execution of stagit. This is because stagit shows t… | |
1598 of textfiles and there is no "cache" for file metadata (this would a… | |
1599 complexity to the code).</li> | |
1600 <li>Not suitable for repositories with many branches, a quite linear his… | |
1601 assumed (from HEAD).</li> | |
1602 <li>Relatively slow to run the first time (about 3 seconds for sbase, | |
1603 1500+ commits), incremental updates are faster.</li> | |
1604 <li>Does not support some of the dynamic features cgit has (for HTTP), l… | |
1605 <ul> | |
1606 <li>Snapshot tarballs per commit.</li> | |
1607 <li>File tree per commit.</li> | |
1608 <li>History log of branches diverged from HEAD.</li> | |
1609 <li>Stats (git shortlog -s).</li> | |
1610 </ul> | |
1611 </li> | |
1612 </ul> | |
1613 | |
1614 <p>This is by design, just use git locally.</p> | |
1615 | |
1616 | |
1617 <h2>Clone</h2> | |
1618 <pre><code>git clone git://<a href="//git.codemadness.org/stagit-gopher/… | |
1619 | |
1620 | |
1621 <h2>Download releases</h2> | |
1622 <p>Releases are available at: | |
1623 | |
1624 <a href="/releases/stagit-gopher/">https://codemadness.org/releases/stag… | |
1625 and | |
1626 <a href="https://dl.2f30.org/releases/">https://dl.2f30.org/releases/</a… | |
1627 ]]></content> | |
1628 </entry> | |
1629 <entry> | |
1630 <title type="text">Saait: a boring HTML page generator</title> | |
1631 <link rel="alternate" type="text/html" href="https://www.codemad… | |
1632 <id>https://www.codemadness.org/saait.html</id> | |
1633 <updated>2020-07-20T00:00:00Z</updated> | |
1634 <published>2017-06-10T00:00:00Z</published> | |
1635 <author> | |
1636 <name>hiltjo</name> | |
1637 <uri>https://www.codemadness.org</uri> | |
1638 </author> | |
1639 <summary type="text">Saait: a boring HTML page generator</summar… | |
1640 <content type="html"><![CDATA[<h1>Saait: a boring HTML page gene… | |
1641 <p><strong>Last modification on </strong> <time>2020-07-20</time… | |
1642 <p>Saait is the most boring static HTML page generator.</p> | |
1643 | |
1644 <p>Meaning of saai (dutch): boring. Pronunciation: site</p> | |
1645 | |
1646 <p><a href="/git/saait/file/README.html">Read the README for more inform… | |
1647 | |
1648 <p> | |
1649 I used to use <a href="/git/static-site-scripts/files.html">shellscripts… | |
1650 but realised I wanted a small program that works on each platform consis… | |
1651 There are many incompatibilities or unimplemented features in base tools… | |
1652 </p> | |
1653 | |
1654 <p>This site is created using saait.</p> | |
1655 | |
1656 | |
1657 <h2>Features</h2> | |
1658 <ul> | |
1659 <li>Single small binary that handles all the things. At run-time no depe… | |
1660 <li>Few lines of code (about 575 lines of C) and no dependencies except:… | |
1661 <li>Works on most platforms: tested on Linux, *BSD, Windows.</li> | |
1662 <li>Simple template syntax.</li> | |
1663 <li>Uses HTML output by default, but can easily be modified to generate … | |
1664 <li>Out-of-the-box supports: creating an index page of all pages, Atom f… | |
1665 </ul> | |
1666 | |
1667 | |
1668 <h2>Cons</h2> | |
1669 <ul> | |
1670 <li>Simple template syntax, but very basic. Requires C knowledge to exte… | |
1671 <li>Only basic (no nested) template blocks supported.</li> | |
1672 </ul> | |
1673 | |
1674 | |
1675 <h2>Clone</h2> | |
1676 <pre><code>git clone git://<a href="//git.codemadness.org/saait/">git.co… | |
1677 | |
1678 | |
1679 <h2>Download releases</h2> | |
1680 <p> | |
1681 Releases are available at: | |
1682 <a href="/releases/saait/">https://codemadness.org/releases/saait/</a>. | |
1683 </p> | |
1684 | |
1685 | |
1686 <h2>Documentation / man page</h2> | |
1687 <p> | |
1688 Below is the saait(1) man page, which includes usage examples. | |
1689 </p> | |
1690 | |
1691 <pre><code>SAAIT(1) General Commands Manual … | |
1692 | |
1693 NAME | |
1694 saait the most boring static page generator | |
1695 | |
1696 SYNOPSIS | |
1697 saait [-c configfile] [-o outputdir] [-t templatesdir] pages... | |
1698 | |
1699 DESCRIPTION | |
1700 saait writes HTML pages to the output directory. | |
1701 | |
1702 The arguments pages are page config files, which are processed in t… | |
1703 given order. | |
1704 | |
1705 The options are as follows: | |
1706 | |
1707 -c configfile | |
1708 The global configuration file, the default is "config.… | |
1709 page configuration file inherits variables from this file. … | |
1710 variables can be overwritten per page. | |
1711 | |
1712 -o outputdir | |
1713 The output directory, the default is "output". | |
1714 | |
1715 -t templatesdir | |
1716 The templates directory, the default is "templates&quo… | |
1717 | |
1718 DIRECTORY AND FILE STRUCTURE | |
1719 A recommended directory structure for pages, although the names can… | |
1720 anything: | |
1721 pages/001-page.cfg | |
1722 pages/001-page.html | |
1723 pages/002-page.cfg | |
1724 pages/002-page.html | |
1725 | |
1726 The directory and file structure for templates must be: | |
1727 templates/<templatename>/header.ext | |
1728 templates/<templatename>/item.ext | |
1729 templates/<templatename>/footer.ext | |
1730 | |
1731 The following filename prefixes are detected for template blocks and | |
1732 processed in this order: | |
1733 | |
1734 "header." | |
1735 Header block. | |
1736 | |
1737 "item." | |
1738 Item block. | |
1739 | |
1740 "footer." | |
1741 Footer block. | |
1742 | |
1743 The files are saved as output/<templatename>, for example | |
1744 templates/atom.xml/* will become: output/atom.xml. If a tem… | |
1745 file does not exist then it is treated as if it was empty. | |
1746 | |
1747 Template directories starting with a dot (".") are ignore… | |
1748 | |
1749 The "page" templatename is special and will be used per p… | |
1750 | |
1751 CONFIG FILE | |
1752 A config file has a simple key=value configuration syntax, for exam… | |
1753 | |
1754 # this is a comment line. | |
1755 filename = example.html | |
1756 title = Example page | |
1757 description = This is an example page | |
1758 created = 2009-04-12 | |
1759 updated = 2009-04-14 | |
1760 | |
1761 The following variable names are special with their respective defa… | |
1762 | |
1763 contentfile | |
1764 Path to the input content filename, by default this is the … | |
1765 of the config file with the last extension replaced to &quo… | |
1766 | |
1767 filename | |
1768 The filename or relative file path for the output file for … | |
1769 page. By default the value is the basename of the contentf… | |
1770 The path of the written output file is the value of filename | |
1771 appended to the outputdir path. | |
1772 | |
1773 A line starting with # is a comment and is ignored. | |
1774 | |
1775 TABs and spaces before and after a variable name are ignored. TABs… | |
1776 spaces before a value are ignored. | |
1777 | |
1778 TEMPLATES | |
1779 A template (block) is text. Variables are replaced with the values… | |
1780 in the config files. | |
1781 | |
1782 The possible operators for variables are: | |
1783 | |
1784 $ Escapes a XML string, for example: < to the entity… | |
1785 | |
1786 # Literal raw string value. | |
1787 | |
1788 % Insert contents of file of the value of the variable. | |
1789 | |
1790 For example in a HTML item template: | |
1791 | |
1792 <article> | |
1793 <header> | |
1794 <h1><a href="">${title}</a… | |
1795 <p> | |
1796 <strong>Last modification on </str… | |
1797 <time datetime="${updated}">… | |
1798 </p> | |
1799 </header> | |
1800 %{contentfile} | |
1801 </article> | |
1802 | |
1803 EXIT STATUS | |
1804 The saait utility exits 0 on success, and >0 if an error occurs. | |
1805 | |
1806 EXAMPLES | |
1807 A basic usage example: | |
1808 | |
1809 1. Create a directory for a new site: | |
1810 | |
1811 mkdir newsite | |
1812 | |
1813 2. Copy the example pages, templates, global config file a… | |
1814 stylesheets to a directory: | |
1815 | |
1816 cp -r pages templates config.cfg style.css print.css newsite/ | |
1817 | |
1818 3. Change the current directory to the created directory. | |
1819 | |
1820 cd newsite/ | |
1821 | |
1822 4. Change the values in the global config.cfg file. | |
1823 | |
1824 5. If you want to modify parts of the header, like the nav… | |
1825 items, you can change the following two template files: | |
1826 templates/page/header.html | |
1827 templates/index.html/header.html | |
1828 | |
1829 6. Create any new pages in the pages directory. For… | |
1830 there has to be a corresponding HTML file. By default this HT… | |
1831 file has the path of the config file, but with the last extens… | |
1832 (".cfg" in this case) replaced to ".html". | |
1833 | |
1834 7. Create an output directory: | |
1835 | |
1836 mkdir -p output | |
1837 | |
1838 8. After any modifications the following commands can be u… | |
1839 generate the output and process the pages in descending order: | |
1840 | |
1841 find pages -type f -name '*.cfg' -print0 | sort -zr | … | |
1842 | |
1843 9. Copy the modified stylesheets to the output directory a… | |
1844 | |
1845 cp style.css print.css output/ | |
1846 | |
1847 10. Open output/index.html locally in your webbrowser to review the | |
1848 changes. | |
1849 | |
1850 11. To synchronize files, you can securely transfer them via SSH u… | |
1851 rsync: | |
1852 | |
1853 rsync -av output/ user@somehost:/var/www/htdocs/ | |
1854 | |
1855 TRIVIA | |
1856 The most boring static page generator. | |
1857 | |
1858 Meaning of saai (dutch): boring, pronunciation of saait: site | |
1859 | |
1860 SEE ALSO | |
1861 find(1), sort(1), xargs(1) | |
1862 | |
1863 AUTHORS | |
1864 Hiltjo Posthuma <[email protected]></code></pre> | |
1865 ]]></content> | |
1866 </entry> | |
1867 <entry> | |
1868 <title type="text">Stagit: a static git page generator</title> | |
1869 <link rel="alternate" type="text/html" href="https://www.codemad… | |
1870 <id>https://www.codemadness.org/stagit.html</id> | |
1871 <updated>2020-07-20T00:00:00Z</updated> | |
1872 <published>2017-05-10T00:00:00Z</published> | |
1873 <author> | |
1874 <name>hiltjo</name> | |
1875 <uri>https://www.codemadness.org</uri> | |
1876 </author> | |
1877 <summary type="text">a static git page generator</summary> | |
1878 <content type="html"><![CDATA[<h1>Stagit: a static git page gene… | |
1879 <p><strong>Last modification on </strong> <time>2020-07-20</time… | |
1880 <p> | |
1881 stagit is a static page generator for git. | |
1882 </p> | |
1883 | |
1884 <p> | |
1885 <a href="/git/stagit/file/README.html">Read the README for more informat… | |
1886 </p> | |
1887 | |
1888 <p> | |
1889 My git repository uses stagit, you can see how it looks here: | |
1890 <a href="/git/">https://codemadness.org/git/</a>. | |
1891 </p> | |
1892 | |
1893 | |
1894 <h2>Features</h2> | |
1895 <ul> | |
1896 <li>Log of all commits from HEAD.</li> | |
1897 <li>Log and diffstat per commit.</li> | |
1898 <li>Show file tree with linkable line numbers.</li> | |
1899 <li>Show references: local branches and tags.</li> | |
1900 <li>Detect README and LICENSE file from HEAD and link it as a webpage.</… | |
1901 <li>Detect submodules (.gitmodules file) from HEAD and link it as a webp… | |
1902 <li>Atom feed log (atom.xml).</li> | |
1903 <li>Make index page for multiple repositories with stagit-index.</li> | |
1904 <li>After generating the pages (relatively slow) serving the files is ve… | |
1905 simple and requires little resources (because the content is static)… | |
1906 a HTTP file server is required.</li> | |
1907 <li>Security: all pages are static. No CGI or dynamic code is run for the | |
1908 interface. Using it with a secure httpd such as OpenBSD httpd it is | |
1909 privilege-separated, chroot(2)'d and pledge(2)'d.</li> | |
1910 <li>Simple to setup: the content generation is clearly separated from se… | |
1911 it. This makes configuration as simple as copying a few directories … | |
1912 scripts.</li> | |
1913 <li>Usable with text-browsers such as dillo, links, lynx and w3m.</li> | |
1914 </ul> | |
1915 | |
1916 | |
1917 <h2>Cons</h2> | |
1918 <ul> | |
1919 <li>Not suitable for large repositories (2000+ commits), because diffsta… | |
1920 an expensive operation, the cache (-c flag) is a workaround for this… | |
1921 some cases.</li> | |
1922 <li>Not suitable for large repositories with many files, because all fil… | |
1923 written for each execution of stagit. This is because stagit shows t… | |
1924 of textfiles and there is no "cache" for file metadata (this would a… | |
1925 complexity to the code).</li> | |
1926 <li>Not suitable for repositories with many branches, a quite linear his… | |
1927 assumed (from HEAD).</li> | |
1928 </ul> | |
1929 | |
1930 <p> | |
1931 In these cases it is better to use <a href="https://git.zx2c4.com/cgit/"… | |
1932 possibly change stagit to run as a CGI program. | |
1933 </p> | |
1934 | |
1935 <ul> | |
1936 <li>Relatively slow to run the first time (about 3 seconds for sbase, | |
1937 1500+ commits), incremental updates are faster.</li> | |
1938 <li>Does not support some of the dynamic features cgit has, like: | |
1939 <ul> | |
1940 <li>Snapshot tarballs per commit.</li> | |
1941 <li>File tree per commit.</li> | |
1942 <li>History log of branches diverged from HEAD.</li> | |
1943 <li>Stats (git shortlog -s).</li> | |
1944 </ul> | |
1945 </li> | |
1946 </ul> | |
1947 | |
1948 <p>This is by design, just use git locally.</p> | |
1949 | |
1950 | |
1951 <h2>Clone</h2> | |
1952 <pre><code>git clone git://<a href="//git.codemadness.org/stagit/">git.c… | |
1953 | |
1954 | |
1955 <h2>Download releases</h2> | |
1956 <p>Releases are available at: | |
1957 | |
1958 <a href="https://codemadness.org/releases/stagit/">https://codemadness.o… | |
1959 and a mirror at | |
1960 <a href="https://dl.2f30.org/releases/">https://dl.2f30.org/releases/</a… | |
1961 ]]></content> | |
1962 </entry> | |
1963 <entry> | |
1964 <title type="text">OpenBSD httpd, slowcgi and cgit</title> | |
1965 <link rel="alternate" type="text/html" href="https://www.codemad… | |
1966 <id>https://www.codemadness.org/openbsd-httpd-and-cgit.html</id> | |
1967 <updated>2015-07-05T00:00:00Z</updated> | |
1968 <published>2015-07-05T00:00:00Z</published> | |
1969 <author> | |
1970 <name>hiltjo</name> | |
1971 <uri>https://www.codemadness.org</uri> | |
1972 </author> | |
1973 <summary type="text">OpenBSD httpd, slowcgi and cgit</summary> | |
1974 <content type="html"><![CDATA[<h1>OpenBSD httpd, slowcgi and cgi… | |
1975 <p><strong>Last modification on </strong> <time>2015-07-05</time… | |
1976 <p> | |
1977 This is a guide to get <a href="https://git.zx2c4.com/cgit/">cgit</a> wo… | |
1978 relatively new <a href="https://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-… | |
1979 <a href="https://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man8/sl… | |
1980 OpenBSD httpd is very simple to setup, but nevertheless this guide might… | |
1981 </p> | |
1982 | |
1983 | |
1984 <h2>Installation</h2> | |
1985 | |
1986 <p>Install the cgit package:</p> | |
1987 <pre><code># pkg_add cgit</code></pre> | |
1988 | |
1989 <p>or build it from ports:</p> | |
1990 <pre><code># cd /usr/ports/www/cgit && make && make install</code></pre> | |
1991 | |
1992 | |
1993 <h2>Configuration</h2> | |
1994 | |
1995 | |
1996 <h3>httpd</h3> | |
1997 <p>An example of <a href="https://www.openbsd.org/cgi-bin/man.cgi/OpenBS… | |
1998 <a href="downloads/openbsd-httpd/httpd.conf">httpd.conf</a>.</p> | |
1999 | |
2000 | |
2001 <h3>slowcgi</h3> | |
2002 <p>By default the slowcgi UNIX domain socket is located at: /var/www/run… | |
2003 For this example we use the defaults.</p> | |
2004 | |
2005 | |
2006 <h3>cgit</h3> | |
2007 <p>The cgit binary should be located at: /var/www/cgi-bin/cgit.cgi (defa… | |
2008 | |
2009 <p>cgit uses the $CGIT_CONFIG environment variable to locate it's config. | |
2010 By default on OpenBSD this is set to /conf/cgitrc (chroot), which is /va… | |
2011 An example of cgitrc is here: <a href="downloads/openbsd-httpd/cgitrc">c… | |
2012 | |
2013 <p>In this example the cgit cache directory is set to /cgit/cache (chroo… | |
2014 Make sure to give this path read and write permissions for cgit (www:dae… | |
2015 | |
2016 <p>In the example the repository path (scan-path) is set to /htdocs/src … | |
2017 | |
2018 <p>The footer file is set to /conf/cgit.footer. Make sure this file exis… | |
2019 <pre><code># >/var/www/conf/cgit.footer</code></pre> | |
2020 | |
2021 <p>Make sure cgit.css (stylesheet) and cgit.png (logo) are accessible, b… | |
2022 (location can be changed in httpd.conf).</p> | |
2023 | |
2024 <p>To support .tar.gz snapshots a static gzip binary is required in the … | |
2025 | |
2026 <pre><code>cd /usr/src/usr.bin/compress | |
2027 make clean && make LDFLAGS="-static -pie" | |
2028 cp obj/compress /var/www/bin/gzip</code></pre> | |
2029 | |
2030 | |
2031 <h2>Running the services</h2> | |
2032 | |
2033 <p>Enable the httpd and slowcgi services to automatically start them at … | |
2034 | |
2035 <pre><code># rcctl enable httpd slowcgi</code></pre> | |
2036 | |
2037 <p>Start the services:</p> | |
2038 | |
2039 <pre><code># rcctl start httpd slowcgi</code></pre> | |
2040 ]]></content> | |
2041 </entry> | |
2042 <entry> | |
2043 <title type="text">twitch: application to watch Twitch streams</… | |
2044 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2045 <id>https://www.codemadness.org/twitch-interface.html</id> | |
2046 <updated>2020-05-06T00:00:00Z</updated> | |
2047 <published>2014-11-23T00:00:00Z</published> | |
2048 <author> | |
2049 <name>hiltjo</name> | |
2050 <uri>https://www.codemadness.org</uri> | |
2051 </author> | |
2052 <summary type="text">twitch: application to watch Twitch streams… | |
2053 <content type="html"><![CDATA[<h1>twitch: application to watch T… | |
2054 <p><strong>Last modification on </strong> <time>2020-05-06</time… | |
2055 <p> | |
2056 <strong>Update: as of 2020-05-06:</strong> I stopped maintaining it. | |
2057 Twitch now requires OAUTH and 2-factor authentication. It requires me to… | |
2058 personal information such as my phone number. | |
2059 </p> | |
2060 | |
2061 <p> | |
2062 <strong>Update: as of ~2020-01-03:</strong> I rewrote this application f… | |
2063 The Twitch Kraken API used by the Golang version was deprecated. | |
2064 It is now rewritten to use the <a href="https://dev.twitch.tv/docs/api/r… | |
2065 It also has a <a href="gopher://codemadness.org/1/twitch.cgi">Gopher ver… | |
2066 You can still find the old code here: | |
2067 <a href="https://git.codemadness.org/twitch-go/file/README.html">twitch-… | |
2068 </p> | |
2069 | |
2070 <p> | |
2071 This script allows to view streams in your own video player like | |
2072 <a href="https://mpv.io/">mpv</a>, so the bloated Twitch interface is no… | |
2073 It uses the Twitch Helix API and is written in C. | |
2074 </p> | |
2075 | |
2076 | |
2077 <h2 id="features">Features</h2> | |
2078 <ul> | |
2079 <li>No Javascript, cookies, CSS optional.</li> | |
2080 <li>Works well in all browsers, including text-based ones.</li> | |
2081 <li>Has a HTTP CGI and Gopher CGI version.</li> | |
2082 <li>Atom feed for VODs.</li> | |
2083 </ul> | |
2084 | |
2085 | |
2086 <h2>Clone</h2> | |
2087 <pre><code>git clone git://<a href="//git.codemadness.org/frontends/">gi… | |
2088 | |
2089 | |
2090 <h2>View</h2> | |
2091 <ul> | |
2092 <li><s><a href="https://twitch.codemadness.org/">You can view the HTTP C… | |
2093 <li><s><a href="gopher://codemadness.org/1/twitch.cgi">You can view the … | |
2094 </ul> | |
2095 ]]></content> | |
2096 </entry> | |
2097 <entry> | |
2098 <title type="text">Userscript: focus input field</title> | |
2099 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2100 <id>https://www.codemadness.org/userscript-focus-input-field.htm… | |
2101 <updated>2014-03-02T00:00:00Z</updated> | |
2102 <published>2014-03-02T00:00:00Z</published> | |
2103 <author> | |
2104 <name>hiltjo</name> | |
2105 <uri>https://www.codemadness.org</uri> | |
2106 </author> | |
2107 <summary type="text">Userscript to focus the first input field o… | |
2108 <content type="html"><![CDATA[<h1>Userscript: focus input field<… | |
2109 <p><strong>Last modification on </strong> <time>2014-03-02</time… | |
2110 <p> | |
2111 This is an userscript I wrote a while ago which allows to focus the firs… | |
2112 This is useful if a site doesn't specify the autofocus attribute for an … | |
2113 </p> | |
2114 | |
2115 | |
2116 <h2>Download</h2> | |
2117 <p><a href="downloads/input_focus.user.js">Download userscript input_foc… | |
2118 ]]></content> | |
2119 </entry> | |
2120 <entry> | |
2121 <title type="text">Userscript: Youtube circumvent age verificati… | |
2122 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2123 <id>https://www.codemadness.org/userscript-youtube-circumvent-ag… | |
2124 <updated>2013-02-21T00:00:00Z</updated> | |
2125 <published>2013-02-21T00:00:00Z</published> | |
2126 <author> | |
2127 <name>hiltjo</name> | |
2128 <uri>https://www.codemadness.org</uri> | |
2129 </author> | |
2130 <summary type="text">Userscript to circumvent Youtube age verifi… | |
2131 <content type="html"><![CDATA[<h1>Userscript: Youtube circumvent… | |
2132 <p><strong>Last modification on </strong> <time>2013-02-21</time… | |
2133 <p> | |
2134 This is an userscript I wrote a while ago which circumvents requiring to… | |
2135 </p> | |
2136 | |
2137 | |
2138 <h2>Download</h2> | |
2139 <p><a href="downloads/youtube_circumvent_sign_in.user.js">Download users… | |
2140 ]]></content> | |
2141 </entry> | |
2142 <entry> | |
2143 <title type="text">Userscript: block stupid fonts</title> | |
2144 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2145 <id>https://www.codemadness.org/userscript-block-stupid-fonts.ht… | |
2146 <updated>2020-03-10T00:00:00Z</updated> | |
2147 <published>2012-10-21T00:00:00Z</published> | |
2148 <author> | |
2149 <name>hiltjo</name> | |
2150 <uri>https://www.codemadness.org</uri> | |
2151 </author> | |
2152 <summary type="text">Userscript to whitelist your favorite fonts… | |
2153 <content type="html"><![CDATA[<h1>Userscript: block stupid fonts… | |
2154 <p><strong>Last modification on </strong> <time>2020-03-10</time… | |
2155 <p> | |
2156 This is an userscript I wrote a while ago which white-lists fonts I like… | |
2157 The reason I made this is because I don't like the inconsistency of cust… | |
2158 </p> | |
2159 | |
2160 | |
2161 <h2>Download</h2> | |
2162 | |
2163 <p><a href="downloads/block_stupid_fonts_v1.2.user.js">Download userscri… | |
2164 | |
2165 <p>Old version: <a href="downloads/block_stupid_fonts.user.js">Download … | |
2166 ]]></content> | |
2167 </entry> | |
2168 <entry> | |
2169 <title type="text">Sfeed: simple RSS and Atom parser</title> | |
2170 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2171 <id>https://www.codemadness.org/sfeed-simple-feed-parser.html</i… | |
2172 <updated>2020-06-28T00:00:00Z</updated> | |
2173 <published>2011-04-01T00:00:00Z</published> | |
2174 <author> | |
2175 <name>hiltjo</name> | |
2176 <uri>https://www.codemadness.org</uri> | |
2177 </author> | |
2178 <summary type="text">Sfeed is a simple RSS and Atom parser (and … | |
2179 <content type="html"><![CDATA[<h1>Sfeed: simple RSS and Atom par… | |
2180 <p><strong>Last modification on </strong> <time>2020-06-28</time… | |
2181 <p>Sfeed is a RSS and Atom parser (and some format programs).</p> | |
2182 | |
2183 <p>It converts RSS or Atom feeds from XML to a TAB-separated file. There… | |
2184 formatting programs included to convert this TAB-separated format to var… | |
2185 other formats. There are also some programs and scripts included to impo… | |
2186 export OPML and to fetch, filter, merge and order feed items.</p> | |
2187 | |
2188 <p>For the most (up-to-date) information see the | |
2189 <a href="/git/sfeed/file/README.html">README</a> file.</p> | |
2190 | |
2191 | |
2192 <h2>Clone</h2> | |
2193 <pre><code>git clone git://<a href="//git.codemadness.org/sfeed/">git.co… | |
2194 | |
2195 | |
2196 <h2>Download releases</h2> | |
2197 <p> | |
2198 Releases are available at: | |
2199 <a href="/releases/sfeed/">https://codemadness.org/releases/sfeed/</a>. | |
2200 </p> | |
2201 | |
2202 <p>NOTE: releases for sfeed can be seen as periodic snapshots. I recomme… | |
2203 use the git version.</p> | |
2204 | |
2205 | |
2206 <h2>Build and install</h2> | |
2207 | |
2208 <pre><code>$ make | |
2209 # make install</code></pre> | |
2210 | |
2211 <h2>Screenshot and examples</h2> | |
2212 <p><a href="downloads/screenshots/sfeed-screenshot.png"><img src="downlo… | |
2213 | |
2214 <p>The above screenshot uses the sfeed_plain format program with | |
2215 <a href="https://tools.suckless.org/dmenu/">dmenu</a>. | |
2216 This program outputs the feed items in a compact way per line as plain-t… | |
2217 stdout. The dmenu program reads these lines from stdin and displays the… | |
2218 X11 list menu. When an item is selected in dmenu it prints this item to … | |
2219 A simple written script can then filter for the url in this output and d… | |
2220 action, like opening it in some browser or open a podcast in your music … | |
2221 </p> | |
2222 | |
2223 <p>For example:</p> | |
2224 <pre><code>#!/bin/sh | |
2225 url=$(sfeed_plain "$HOME/.sfeed/feeds/"* | dmenu -l 35 -i | \ | |
2226 sed -n 's@^.* \([a-zA-Z]*://\)\(.*\)$@\1\2@p') | |
2227 test -n "${url}" && $BROWSER "${url}"</code></pre> | |
2228 | |
2229 <p>However this is just one way to format and interact with feed items. | |
2230 See also the README for other practical examples.</p> | |
2231 | |
2232 <p>Below are some examples of output that are supported by the included … | |
2233 programs:</p> | |
2234 | |
2235 <ul> | |
2236 <li><a href="downloads/sfeed/plain/feeds.txt">plain text (UTF-8)… | |
2237 <li><a href="downloads/sfeed/html/feeds.html">HTML (CSS)</a></li> | |
2238 <li><a href="downloads/sfeed/frames/index.html">HTML frames</a><… | |
2239 <li>gopher</li> | |
2240 <li><a href="downloads/sfeed/mbox/feeds.mbox">mbox</a></li> | |
2241 <li><a href="downloads/sfeed/twtxt/twtxt.txt">twtxt</a></li> | |
2242 <li><a href="downloads/sfeed/atom/feeds.xml">atom</a></li> | |
2243 </ul> | |
2244 | |
2245 <p> | |
2246 For a separate curses UI front-end, see also <a href="sfeed_curses-ui.ht… | |
2247 </p> | |
2248 ]]></content> | |
2249 </entry> | |
2250 <entry> | |
2251 <title type="text">Vim theme: relaxed</title> | |
2252 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2253 <id>https://www.codemadness.org/vim-theme-relaxed.html</id> | |
2254 <updated>2011-01-07T00:00:00Z</updated> | |
2255 <published>2011-01-07T00:00:00Z</published> | |
2256 <author> | |
2257 <name>hiltjo</name> | |
2258 <uri>https://www.codemadness.org</uri> | |
2259 </author> | |
2260 <summary type="text">a dark VIM theme I made and use on a daily … | |
2261 <content type="html"><![CDATA[<h1>Vim theme: relaxed</h1> | |
2262 <p><strong>Last modification on </strong> <time>2011-01-07</time… | |
2263 <p>This is a dark theme I made for <a href="http://www.vim.org/"… | |
2264 This is a theme I personally used for quite a while now and over time tw… | |
2265 It is made for gvim, but also works for 16-colour terminals (with small … | |
2266 The relaxed.vim file also has my .Xdefaults file colours listed at the t… | |
2267 terminals on X11.</p> | |
2268 | |
2269 <p>It is inspired by the "desert" theme available at <a href="https://ww… | |
2270 although I removed the cursive and bold styles and changed some colours … | |
2271 | |
2272 | |
2273 <h2>Download</h2> | |
2274 | |
2275 <p><a href="downloads/themes/vim/relaxed.vim">relaxed.vim</a></p> | |
2276 | |
2277 | |
2278 <h2>Screenshot</h2> | |
2279 | |
2280 <p><a href="downloads/themes/vim/vim_relaxed_theme.png"><img src="downlo… | |
2281 ]]></content> | |
2282 </entry> | |
2283 <entry> | |
2284 <title type="text">Seturgent: set urgency hints for X applicatio… | |
2285 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2286 <id>https://www.codemadness.org/seturgent-set-urgency-hints-for-… | |
2287 <updated>2020-07-20T00:00:00Z</updated> | |
2288 <published>2010-10-31T00:00:00Z</published> | |
2289 <author> | |
2290 <name>hiltjo</name> | |
2291 <uri>https://www.codemadness.org</uri> | |
2292 </author> | |
2293 <summary type="text">Seturgent is a small utility to set an appl… | |
2294 <content type="html"><![CDATA[<h1>Seturgent: set urgency hints f… | |
2295 <p><strong>Last modification on </strong> <time>2020-07-20</time… | |
2296 <p> | |
2297 Seturgent is a small utility to set an application it's urgency hint. | |
2298 For most windowmanager's and panel applications this will highlight | |
2299 the application and will allow special actions. | |
2300 </p> | |
2301 | |
2302 | |
2303 <h2>Clone</h2> | |
2304 <pre><code>git clone git://<a href="//git.codemadness.org/seturgent/">gi… | |
2305 | |
2306 | |
2307 <h2>Download releases</h2> | |
2308 <p> | |
2309 Releases are available at: | |
2310 <a href="/releases/seturgent/">https://codemadness.org/releases/seturgen… | |
2311 </p> | |
2312 ]]></content> | |
2313 </entry> | |
2314 <entry> | |
2315 <title type="text">GTK2 theme: gtk-murrine-rape</title> | |
2316 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2317 <id>https://www.codemadness.org/gtk2-theme-gtk-murrine-rape.html… | |
2318 <updated>2010-10-31T00:00:00Z</updated> | |
2319 <published>2010-10-31T00:00:00Z</published> | |
2320 <author> | |
2321 <name>hiltjo</name> | |
2322 <uri>https://www.codemadness.org</uri> | |
2323 </author> | |
2324 <summary type="text">A plain consistent GTK2 theme with no fluff… | |
2325 <content type="html"><![CDATA[<h1>GTK2 theme: gtk-murrine-rape</… | |
2326 <p><strong>Last modification on </strong> <time>2010-10-31</time… | |
2327 <h2>Download</h2> | |
2328 <p><a href="downloads/themes/gtk/murrine-rape/gtk-2.0/gtkrc">gtkrc</a></… | |
2329 | |
2330 | |
2331 <h2>Screenshot</h2> | |
2332 <p><a href="downloads/themes/gtk/murrine-rape/gtk-murrine-rape.png"><img… | |
2333 | |
2334 | |
2335 <h2>Features</h2> | |
2336 <ul> | |
2337 <li>Good contrast between UI elements and consistency (imho).</li> | |
2338 <li>Plain colours; no bright colours and (almost) no gradients.</li> | |
2339 <li>No rounded borders.</li> | |
2340 <li>No animations (progressbar etc).</li> | |
2341 <li>Uses the fast and easy customizable gtk-engine-murrine.</li> | |
2342 </ul> | |
2343 | |
2344 | |
2345 <h2>Dependency</h2> | |
2346 <p>Depends on the git version of gtk-engine-murrine last I checked: | |
2347 <a href="http://www.cimitan.com/murrine/">http://www.cimitan.com/murrine… | |
2348 (link broken 2017-08-04).</p> | |
2349 ]]></content> | |
2350 </entry> | |
2351 <entry> | |
2352 <title type="text">DWM-hiltjo: my windowmanager configuration</t… | |
2353 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2354 <id>https://www.codemadness.org/dwm-hiltjo-my-windowmanager-conf… | |
2355 <updated>2020-07-20T00:00:00Z</updated> | |
2356 <published>2010-08-12T00:00:00Z</published> | |
2357 <author> | |
2358 <name>hiltjo</name> | |
2359 <uri>https://www.codemadness.org</uri> | |
2360 </author> | |
2361 <summary type="text">My DWM configuration; a few added features … | |
2362 <content type="html"><![CDATA[<h1>DWM-hiltjo: my windowmanager c… | |
2363 <p><strong>Last modification on </strong> <time>2020-07-20</time… | |
2364 <p>As you might know DWM is a very minimal windowmanager: <a hre… | |
2365 It's known to only have the most essential features one needs, everythin… | |
2366 many available <a href="https://dwm.suckless.org/patches/">patches</a>. … | |
2367 of this it's quite easy in my opinion to see how it works and modify it.… | |
2368 | |
2369 <p>I really like my configuration at the moment and want to share my cha… | |
2370 | |
2371 <p><em>Disclaimer: this configuration is entirely made for my personal p… | |
2372 | |
2373 | |
2374 <h2>Features</h2> | |
2375 <ul> | |
2376 <li>Titlebar: | |
2377 <ul> | |
2378 <li>Shows all clients of the selected / active t… | |
2379 <li>Divide application bars evenly among availab… | |
2380 <li>Colour urgent clients in the taskbar on acti… | |
2381 <li>Left-click focuses clicked client.</li> | |
2382 <li>Right-click toggles monocle layout.</li> | |
2383 <li>Middle-click kills the clicked client.</li> | |
2384 </ul> | |
2385 </li> | |
2386 <li>Tagbar: | |
2387 <ul> | |
2388 <li>Only show active tags.</li> | |
2389 <li>Colour inactive tags with urgent clients.</l… | |
2390 </ul> | |
2391 </li> | |
2392 <li>Layouts: | |
2393 <ul> | |
2394 <li>Cycle layouts with Modkey + Space (next) and… | |
2395 <li>Fullscreen layout (hides topbar and removes … | |
2396 </ul> | |
2397 </li> | |
2398 <li>Other: | |
2399 <ul> | |
2400 <li>Move tiled clients around with the mouse (dr… | |
2401 <li>Add some keybinds for multimedia keyboards (… | |
2402 </ul> | |
2403 </li> | |
2404 <li>... and more ;) ...</li> | |
2405 </ul> | |
2406 | |
2407 <p> | |
2408 NOTES: I removed application icons (_NET_WM_ICON support), but if you wa… | |
2409 Pertag-like behaviour is also removed since it's wrong. | |
2410 Cycling through urgent clients is also removed. | |
2411 </p> | |
2412 | |
2413 | |
2414 <h2>Clone</h2> | |
2415 <pre><code>git clone -b hiltjo git://<a href="//git.codemadness.org/dwm/… | |
2416 | |
2417 | |
2418 <h2>Screenshot</h2> | |
2419 <p><a href="downloads/screenshots/dwm-screenshot.png"><img src="download… | |
2420 ]]></content> | |
2421 </entry> | |
2422 <entry> | |
2423 <title type="text">Query unused CSS rules on current document st… | |
2424 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2425 <id>https://www.codemadness.org/query-unused-css-rules-on-curren… | |
2426 <updated>2010-04-21T00:00:00Z</updated> | |
2427 <published>2010-04-21T00:00:00Z</published> | |
2428 <author> | |
2429 <name>hiltjo</name> | |
2430 <uri>https://www.codemadness.org</uri> | |
2431 </author> | |
2432 <summary type="text">How to see all the rules in a stylesheet (C… | |
2433 <content type="html"><![CDATA[<h1>Query unused CSS rules on curr… | |
2434 <p><strong>Last modification on </strong> <time>2010-04-21</time… | |
2435 <p> | |
2436 Today I was doing some web development and wanted to see all the rules | |
2437 in a stylesheet (CSS) that were not used for the current document. I | |
2438 wrote the following Javascript code which you can paste in the Firebug | |
2439 console and run: | |
2440 </p> | |
2441 | |
2442 <pre><code>(function() { | |
2443 for (var i=0;i<document.styleSheets.length;i++) { | |
2444 var rules = document.styleSheets[i].cssRules || []; | |
2445 var sheethref = document.styleSheets[i].href || 'inline'; | |
2446 for (var r=0;r<rules.length;r++) | |
2447 if (!document.querySelectorAll(rules[r].selector… | |
2448 console.log(sheethref + ': "' + rules[r]… | |
2449 } | |
2450 })(); | |
2451 </code></pre> | |
2452 | |
2453 <p>This will output all the (currently) unused CSS rules per selector, t… | |
2454 | |
2455 <pre><code>http://www.codemadness.nl/blog/wp-content/themes/codemadness/… | |
2456 http://www.codemadness.nl/blog/wp-content/themes/codemadness/style.css: … | |
2457 http://www.codemadness.nl/blog/wp-content/themes/codemadness/style.css: … | |
2458 http://www.codemadness.nl/blog/wp-content/themes/codemadness/style.css: … | |
2459 http://www.codemadness.nl/blog/wp-content/themes/codemadness/style.css: … | |
2460 http://www.codemadness.nl/blog/wp-content/themes/codemadness/style.css: … | |
2461 </code></pre> | |
2462 | |
2463 <p>Just a trick I wanted to share, I hope someone finds this useful :)</… | |
2464 | |
2465 <p>For webkit-based browsers you can use "Developer Tools" and use "Audi… | |
2466 | |
2467 <p>Tested on Chrome and Firefox.</p> | |
2468 ]]></content> | |
2469 </entry> | |
2470 <entry> | |
2471 <title type="text">Driconf: enabling S3 texture compression on L… | |
2472 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2473 <id>https://www.codemadness.org/driconf-enabling-s3-texture-comp… | |
2474 <updated>2020-08-21T00:00:00Z</updated> | |
2475 <published>2009-07-05T00:00:00Z</published> | |
2476 <author> | |
2477 <name>hiltjo</name> | |
2478 <uri>https://www.codemadness.org</uri> | |
2479 </author> | |
2480 <summary type="text">driconf: enabling S3 texture compression</s… | |
2481 <content type="html"><![CDATA[<h1>Driconf: enabling S3 texture c… | |
2482 <p><strong>Last modification on </strong> <time>2020-08-21</time… | |
2483 <p><strong>Update: the DXTC patent expired on 2018-03-16, many d… | |
2484 | |
2485 <p> | |
2486 S3TC (also known as DXTn or DXTC) is a patented lossy texture compressio… | |
2487 See: <a href="https://en.wikipedia.org/wiki/S3TC">https://en.wikipedia.o… | |
2488 Many games use S3TC and if you use Wine to play games you definitely wan… | |
2489 | |
2490 Because this algorithm was <a href="https://dri.freedesktop.org/wiki/S3T… | |
2491 </p> | |
2492 | |
2493 <p> | |
2494 To enable it you can install the library "libtxc" if your favorite OS ha… | |
2495 | |
2496 For easy configuration you can install the optional utility DRIconf, whi… | |
2497 DriConf can safely be removed after configuration. | |
2498 </p> | |
2499 | |
2500 | |
2501 <h2>Steps to enable it</h2> | |
2502 <ol> | |
2503 <li> | |
2504 <p>Install libtxc_dxtn</p> | |
2505 <p>ArchLinux:</p> | |
2506 <pre><code># pacman -S libtxc_dxtn</code></pre> | |
2507 <p>Debian:</p> | |
2508 <pre><code># aptitude install libtxc-dxtn-s2tc0</code></pre> | |
2509 </li> | |
2510 <li> | |
2511 <p>Install driconf (optional).</p> | |
2512 <p>ArchLinux:</p> | |
2513 <pre><code># pacman -S driconf</code></pre> | |
2514 <p>Debian:</p> | |
2515 <pre><code># aptitude install driconf</code></pre> | |
2516 </li> | |
2517 <li> | |
2518 <p>Run driconf and enable S3TC</p> | |
2519 <a href="downloads/screenshots/driconf.png"><img src="downloads/… | |
2520 </li> | |
2521 </ol> | |
2522 | |
2523 | |
2524 <h2>Additional links</h2> | |
2525 <ol> | |
2526 <li>S3TC: <a href="https://dri.freedesktop.org/wiki/S3TC/">https… | |
2527 <li>DriConf: <a href="https://dri.freedesktop.org/wiki/DriConf">… | |
2528 </ol> | |
2529 ]]></content> | |
2530 </entry> | |
2531 <entry> | |
2532 <title type="text">Getting the USB-powerline bridge to work on L… | |
2533 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2534 <id>https://www.codemadness.org/getting-the-usb-powerline-bridge… | |
2535 <updated>2019-12-06T00:00:00Z</updated> | |
2536 <published>2009-04-13T00:00:00Z</published> | |
2537 <author> | |
2538 <name>hiltjo</name> | |
2539 <uri>https://www.codemadness.org</uri> | |
2540 </author> | |
2541 <summary type="text">A guide to get a USB-powerline bridge with … | |
2542 <content type="html"><![CDATA[<h1>Getting the USB-powerline brid… | |
2543 <p><strong>Last modification on </strong> <time>2019-12-06</time… | |
2544 <p><strong>NOTE: this guide is obsolete, a working driver is now… | |
2545 | |
2546 <h2>Introduction</h2> | |
2547 <p> | |
2548 A USB to powerline bridge is a network device that instead of using an o… | |
2549 A more comprehensive explanation of what it is and how it works you can … | |
2550 </p> | |
2551 | |
2552 <p>Known products that use the Intellon 51x1 chipset:</p> | |
2553 <ul> | |
2554 <li>MicroLink dLAN USB</li> | |
2555 <li>"Digitus network"</li> | |
2556 <li>Intellon USB Ethernet powerline adapter</li> | |
2557 <li>Lots of other USB-powerline adapters...</li> | |
2558 </ul> | |
2559 | |
2560 <p>To check if your device is supported:</p> | |
2561 <pre><code>$ lsusb | grep -i 09e1 | |
2562 Bus 001 Device 003: ID 09e1:5121 Intellon Corp.</code></pre> | |
2563 <p>If the vendor (09e1) and product (5121) ID match then it's probably s… | |
2564 | |
2565 | |
2566 <h2>Installation</h2> | |
2567 <p>Get drivers from the official site<sup><a href="http://www.devolo.co.… | |
2568 | |
2569 <p>Extract them:</p> | |
2570 <pre><code>$ tar -xzvf dLAN-linux-package-v4.tar.gz</code></pre> | |
2571 | |
2572 <p>Go to the extracted directory and compile them:</p> | |
2573 <pre><code>$ ./configure | |
2574 $ make</code></pre> | |
2575 | |
2576 <p>Depending on the errors you got you might need to download<sup><a hre… | |
2577 <pre><code>$ cd dLAN-linux-package-v4/ (or other path to the source … | |
2578 $ patch < int51x1.patch</code></pre> | |
2579 | |
2580 <p>Try again:</p> | |
2581 <pre><code>$ ./configure | |
2582 $ make</code></pre> | |
2583 | |
2584 <p>If that failed try:</p> | |
2585 <pre><code>$ ./configure | |
2586 $ KBUILD_NOPEDANTIC=1 make</code></pre> | |
2587 | |
2588 <p>If that went OK install the drivers (as root):</p> | |
2589 <pre><code># make install</code></pre> | |
2590 | |
2591 <p>Check if the "devolo_usb" module is loaded:</p> | |
2592 <pre><code>$ lsmod | grep -i devolo_usb</code></pre> | |
2593 <p>If it shows up then it's loaded. Now check if the interface is added:… | |
2594 <pre><code>$ ifconfig -a | grep -i dlanusb | |
2595 dlanusb0 Link encap:Ethernet HWaddr 00:12:34:56:78:9A</code></pre> | |
2596 | |
2597 | |
2598 <h2>Configuration</h2> | |
2599 <p>It is assumed you use a static IP, otherwise you can just use your DH… | |
2600 <pre><code># ifconfig dlanusb0 192.168.2.12 netmask 255.255.255.0</code>… | |
2601 | |
2602 | |
2603 <h2>Checking if the network works</h2> | |
2604 <p>Try to ping an IP address on your network to test for a working conne… | |
2605 <pre><code>$ ping 192.168.2.1 | |
2606 PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data. | |
2607 64 bytes from 192.168.2.1: icmp_seq=1 ttl=30 time=2.49 ms | |
2608 64 bytes from 192.168.2.1: icmp_seq=2 ttl=30 time=3.37 ms | |
2609 64 bytes from 192.168.2.1: icmp_seq=3 ttl=30 time=2.80 ms | |
2610 --- 192.168.2.1 ping statistics --- | |
2611 3 packets transmitted, 3 received, 0% packet loss, time 2005ms | |
2612 rtt min/avg/max/mdev = 2.497/2.891/3.374/0.368 ms</code></pre> | |
2613 | |
2614 <p> | |
2615 You can now set up a network connection like you normally do with any Et… | |
2616 The route can be added like this for example:</p> | |
2617 <pre><code># route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.2.1 dlanu… | |
2618 | |
2619 <p>Change the IP address of your local gateway accordingly. Also make su… | |
2620 <pre><code>nameserver 192.168.2.1</code></pre> | |
2621 | |
2622 <p>Test your internet connection by doing for example:</p> | |
2623 <pre><code>$ ping codemadness.org | |
2624 PING codemadness.org (64.13.232.151) 56(84) bytes of data. | |
2625 64 bytes from acmkoieeei.gs02.gridserver.com (64.13.232.151): icmp_seq=1… | |
2626 64 bytes from acmkoieeei.gs02.gridserver.com (64.13.232.151): icmp_seq=2… | |
2627 64 bytes from acmkoieeei.gs02.gridserver.com (64.13.232.151): icmp_seq=3… | |
2628 --- codemadness.org ping statistics --- | |
2629 3 packets transmitted, 3 received, 0% packet loss, time 1999ms | |
2630 rtt min/avg/max/mdev = 155.986/156.312/156.731/0.552 ms</code></pre> | |
2631 | |
2632 <p> | |
2633 If this command failed you probably have not setup your DNS/gateway prop… | |
2634 If it worked then good for you :) | |
2635 </p> | |
2636 | |
2637 | |
2638 <h2>References</h2> | |
2639 <ol> | |
2640 <li><a href="http://www.devolo.co.uk/consumer/downloads-44-micro… | |
2641 <li><a href="downloads/int51x1/dLAN-linux-package-v4.tar.gz">dLA… | |
2642 <li><a href="downloads/int51x1/int51x1.patch">Patch for recent 2… | |
2643 <li><a href="downloads/int51x1/INT51X1_datasheet.pdf">INT51X1 da… | |
2644 </ol> | |
2645 ]]></content> | |
2646 </entry> | |
2647 <entry> | |
2648 <title type="text">Gothic 1 game guide</title> | |
2649 <link rel="alternate" type="text/html" href="https://www.codemad… | |
2650 <id>https://www.codemadness.org/gothic-1-guide.html</id> | |
2651 <updated>2020-04-30T00:00:00Z</updated> | |
2652 <published>2009-04-12T00:00:00Z</published> | |
2653 <author> | |
2654 <name>hiltjo</name> | |
2655 <uri>https://www.codemadness.org</uri> | |
2656 </author> | |
2657 <summary type="text">Gothic 1 game guide with some useful tips</… | |
2658 <content type="html"><![CDATA[<h1>Gothic 1 game guide</h1> | |
2659 <p><strong>Last modification on </strong> <time>2020-04-30</time… | |
2660 <p>Disclaimer: <em> | |
2661 Some (including myself) may find some of these hints/exploits cheating. … | |
2662 guide is just for educational and fun purposes. Some of these hints/tips… | |
2663 to Gothic 2 as well. I got the meat exploit from a guide somewhere on the | |
2664 internet I can't recall where, anyway kudos to that person. The other ex… | |
2665 I discovered myself. If you use some hints or exploits from these guide, | |
2666 please add me to your "credits", I will appreciate it :) | |
2667 </em></p> | |
2668 | |
2669 | |
2670 <h2>Configuration</h2> | |
2671 | |
2672 | |
2673 <h3>Widescreen resolution</h3> | |
2674 <p> | |
2675 Gothic supports widescreen resolutions with a small tweak, add the follo… | |
2676 text string as a command-line argument: | |
2677 </p> | |
2678 | |
2679 <pre><code>-zRes:1920,1200,32</code></pre> | |
2680 | |
2681 <p> | |
2682 This also works for Gothic 2. Here 1920 is the width, 1200 the height and | |
2683 32 the bits per pixel, change this to your preferred resolution. | |
2684 </p> | |
2685 | |
2686 | |
2687 <h3>Fix crash with Steam version</h3> | |
2688 <p> | |
2689 Disable steam overlay. If that doesn't work rename GameOverlayRenderer.d… | |
2690 your steam folder to _GameOverlayRenderer.dll. | |
2691 </p> | |
2692 | |
2693 <p>I strongly recommend to buy the better version from <a | |
2694 href="https://www.gog.com/game/gothic">GOG.com</a>. The GOG version has… | |
2695 and allows easier modding, it also allows playing in most published lang… | |
2696 German, English, Polish, furthermore it has some original artwork and | |
2697 soundtrack included.</p> | |
2698 | |
2699 <h3>Upgrade Steam version to stand-alone version and remove Steam DRM (G… | |
2700 <p>You can install the Gothic playerkit and patches to remove the Steam … | |
2701 | |
2702 <p><a href="https://www.worldofgothic.de/">WorldOfGothic</a> playerkit p… | |
2703 | |
2704 <ul> | |
2705 <li>Gothic 1 (EN): <a href="http://www.worldofgothic.com/dl/?go=dlfile&f… | |
2706 <li>Gothic 1 (DE): <a href="https://www.worldofgothic.de/dl/download_34.… | |
2707 <li>Gothic 2 (EN/DE): <a href="https://www.worldofgothic.de/dl/download_… | |
2708 </ul> | |
2709 | |
2710 | |
2711 <h3>Play Gothic in a different language with English subtitles (works be… | |
2712 | |
2713 <p>If you're like me and have played the English version many times, but… | |
2714 like to hear the (original) voice audio or if you would like to play with | |
2715 different audio than you're used to, then you can copy the speech.vdf fi… | |
2716 your preferred version to your game files. Optionally turn on subtitles.… | |
2717 used this to play the English version of Gothic with the original German… | |
2718 audio and English subtitles.</p> | |
2719 | |
2720 | |
2721 <h2>Easy money/weapons/armour/other items</h2> | |
2722 | |
2723 | |
2724 <h3>Steal from Huno</h3> | |
2725 <p>At night attack Huno the smith in the Old Camp and steal all his stee… | |
2726 make some weapons and sell them with a merchant. When you ask Huno about | |
2727 blacksmith equipment it will respawn with 5 of each kind of steel. This … | |
2728 a fairly good starting weapon (requires 20 strength). Also his chest lo… | |
2729 near the sharpening stone and fire contains some steel as well, lock-pic… | |
2730 The combination is: RRLRLL. The chest contains _at least_ 20 raw steel, … | |
2731 it to get 20 crude swords which you can sell for 50 ore each to a mercha… | |
2732 This will generate some nice starting money (1000+ ore) :)</p> | |
2733 | |
2734 | |
2735 <h3>Steal weapons from the castle in the Old camp</h3> | |
2736 <p>This tip is useful for getting pretty good starting weapons.</p> | |
2737 | |
2738 <p>Before entering the castle itself drop your ore (Left control + down … | |
2739 in front of it. This will ensure when you get caught (and you probably w… | |
2740 no ore will get stolen by the guards. Now use the "slip past guard" tech… | |
2741 described below and you should be able to get into Gomez his castle. Run… | |
2742 left where some weapons are stored. Now make sure you at least steal the… | |
2743 weapon (battle sword) and steal as much as you can until you get whacked… | |
2744 usually stand in the corner since that's where the best weapons are (bat… | |
2745 sword, judgement sword, etc). You'll now have some nice starting weapon(… | |
2746 the good thing is they require very little attributes (about 13 strength… | |
2747 | |
2748 | |
2749 <h3>Free scraper armour the new camp</h3> | |
2750 <p>In the new camp go to the mine and talk to Swiney at the bottom of "T… | |
2751 Hollow". Ask who he is and then ask to join the scrapers. He will give … | |
2752 "Diggers dress" worth 250 ore. It has the following stats: + 10 against | |
2753 weapons. + 5 against fire. This will also give you free entrance to the… | |
2754 the new camp.</p> | |
2755 | |
2756 <h3>Unlimited water bottles in the new camp</h3> | |
2757 <p>In the quest from Lefty you will be assigned to get water bottles fro… | |
2758 rice lord. He will give you infinite amounts of water bottles, in batch… | |
2759 12.</p> | |
2760 | |
2761 | |
2762 <h3>Armour amulet and increase HP potion</h3> | |
2763 <p> | |
2764 In the old camp in the main castle there are at least 3 chests with valu… | |
2765 </p> | |
2766 <ul> | |
2767 <li>Middle right side (looking from the entrance), 1 chest: | |
2768 <ul> | |
2769 <li>lock combination: LLLLRLRL</li> | |
2770 <li>loot: | |
2771 <ul> | |
2772 <li>+15 against weapons, +15 aga… | |
2773 </ul> | |
2774 </li> | |
2775 <li>additionally there are 2 locked doors at the… | |
2776 the final room there are 3 floors with lots … | |
2777 </ul> | |
2778 </li> | |
2779 <li>Left side, 1 chest: | |
2780 <ul> | |
2781 <li>lock combination: RLLLLLRR</li> | |
2782 <li>loot: | |
2783 <ul> | |
2784 <li>+8 mana amulet (worth: 600 o… | |
2785 <li>2 potions (+70 hp)</li> | |
2786 <li>dreamcall (weed)</li> | |
2787 <li>120 coins (worth: nothing)</… | |
2788 </ul> | |
2789 </li> | |
2790 </ul> | |
2791 </li> | |
2792 <li>Right side, 2 chests with: | |
2793 <ul> | |
2794 <li>lock combination: RLLLRLLR</li> | |
2795 <li>loot: | |
2796 <ul> | |
2797 <li>armour amulets, +15 against … | |
2798 <li>maximum life potion, +10 max… | |
2799 <li>speed potion (1 minute durat… | |
2800 <li>4 potions (+70 hp)</li> | |
2801 </ul> | |
2802 </li> | |
2803 </ul> | |
2804 </li> | |
2805 </ul> | |
2806 | |
2807 | |
2808 <h3>Swamp camp harvest twice</h3> | |
2809 | |
2810 <p>In the swamp-weed harvest quest you must get swamp-weed for a guru. A… | |
2811 this quest you can get the harvest again, but you can keep the harvest w… | |
2812 consequences.</p> | |
2813 | |
2814 <h2>Exploits</h2> | |
2815 | |
2816 | |
2817 <h3>Slip past guards</h3> | |
2818 | |
2819 <p>This exploit is really simple, just draw your weapon before you're | |
2820 "targeted" by the guard and run past them this bypasses the dialog seque… | |
2821 When you're just out of their range holster your weapon again, so the pe… | |
2822 around won't get pissed off.</p> | |
2823 | |
2824 <p>Works really well on the guards in front of the Old camp's castle, Y'… | |
2825 templars and New camp mercenaries near the Water magicians, just to name… | |
2826 few.</p> | |
2827 | |
2828 <h3>Meat duplication</h3> | |
2829 <p>Go to a pan and focus / target it so it says "frying pan" or similar.… | |
2830 open your inventory and select the meat. Now cook the meat (for me Left … | |
2831 + Arrow up). The inventory should remain open. You'll now have twice as … | |
2832 meat as you had before. Do this a few times and you'll have a lot of mea… | |
2833 for trading with ore/other items as well.</p> | |
2834 | |
2835 | |
2836 <h3>Fall from great heights</h3> | |
2837 <p>When you fall or jump from where you usually get fall damage you can … | |
2838 following trick: slightly before the ground use left or right strafe. | |
2839 This works because it resets the falling animation. There are also other… | |
2840 to achieve the same thing such as attacking with a weapon in the air. | |
2841 </p> | |
2842 | |
2843 | |
2844 <h2>Experience / level up tips</h2> | |
2845 | |
2846 | |
2847 <h3>Test of faith (extra exp)</h3> | |
2848 <p>You get an additional 750 exp (from Lares) when you forge the letter … | |
2849 new camp and then give it to Diego. You can still join both camps after … | |
2850 | |
2851 | |
2852 <h3>Fighting skeleton mages and their skeletons</h3> | |
2853 <p>An easy way to get more experience is to let the skeleton mages summo… | |
2854 much skeletons as they can. After you have defeated all of them: kill the | |
2855 skeleton mage.</p> | |
2856 | |
2857 | |
2858 <h3>Permanent str/dex/mana/hp potions/items and teachers</h3> | |
2859 <p>When you want to get the maximum power at the end of the game you sho… | |
2860 save up the items that give you a permanent boost. Teachers of strength, | |
2861 dexterity and mana won't train over 100 of each skill. However using po… | |
2862 and quest rewards you can increase this over 100.</p> | |
2863 | |
2864 <p>You should also look out for the following:</p> | |
2865 <ul> | |
2866 <li>Learn to get extra force into your punch from Horatio (stren… | |
2867 can't be done after level 100 strength).</li> | |
2868 <li>Smoke the strongest non-quest joint (+2 mana).</li> | |
2869 </ul> | |
2870 | |
2871 | |
2872 <h3>Permanent potions in Sleeper temple</h3> | |
2873 <p>This one is really obvious, but I would like to point out the mummy's… | |
2874 each side where Xardas is located have lots and I mean lots of permanent | |
2875 potions. This will give you a nice boost before the end battle.</p> | |
2876 | |
2877 | |
2878 <h3>Permanent potions as reward in quests</h3> | |
2879 <p>Always pick the permanent potion as a reward for quests when you can,… | |
2880 example the quest for delivering the message to the High Fire magicians … | |
2881 potion) or the one for fetching the almanac for the sect camp. Don't fo… | |
2882 pick up the potions from Riordian the water magician when you're doing t… | |
2883 focus stones quest, it contains a strength and dexterity potion (+3).</p> | |
2884 | |
2885 | |
2886 <h3>In conclusion</h3> | |
2887 <p>When you use the tips described above Gothic should be a really easy … | |
2888 and you should be able to get at a high(er) level with lots of | |
2889 mana/strength/hp.</p> | |
2890 | |
2891 <p>Have fun!</p> | |
2892 ]]></content> | |
2893 </entry> | |
2894 </feed> |