Stories
Slash Boxes
Comments

SoylentNews is people

Log In

Log In

Create Account  |  Retrieve Password


Pressure Cooker, Induction Heater, systemd, PHP and MySQL

Posted by cafebabe on Friday January 13 2017, @08:55AM (#2192)
10 Comments
Hardware

Every year between Christmas and New Year, there is a geek gathering in Germany organized by the Chaos Communications Club. Talks are available on their website and I've taken the opportunity to trawl through the archive. One of the more accessible projects is an ongoing attempt to make a cooking machine which combines weighing scales, slicer, rice cooker, pressure cooker and sous-vide cooker. That's a sensible idea. However, the implementation is barking mad. Version 1 and version 2 are described in a 54 minute talk from 2012. Version 3 and version 4 are described in a 39 minute talk from 2014. I prefer version 2, especially given that a potential investor requested the second prototype then said something akin to "I wished you hadn't shown me this."

I have extreme misgivings about the placement of a Raspberry Pi - a credit card computer with no ECC RAM or other safeguards - in the proximity of heat and magnetic fields. This isn't just a means of bootstrapping. The entire design philosophy is about dangerous kludging and shows neither expertise in hardware or software. Another blown 1.2kV transistor? That was an impressive noise. Control software written in PHP. XML configuration deprecated in favour of MySQL Server. Thankfully, they're not completely mad and strongly discourage (intentional) remote control of the machine. Also, there is consideration for an emergency stop button, as defined in ISO 13850. However, if they want to rank recipes by use then the control systems (running systemd) will be communicating on the public Internet. And I don't have any faith that it'll be achieved securely and competently.

"A watched pot never boils"? Perhaps that'll become "A watched IoT pot never explodes."

Setting Sensible Compiler Flags

Posted by cafebabe on Thursday January 05 2017, @05:10AM (#2183)
9 Comments
Code

Compiler flags have become horribly sub-optimal and can be greatly improved for small computers and virtual hosting. The lazy case:-

gcc -O3 foo.cc

should be strictly avoided. Assuming this is run on a computer with 1GB RAM, this is functionally equivalent to setting some of the flags to:-

gcc --param ggc-min-heapsize=131072 --param ggc-min-expand=100 -fno-strict-overflow -fsigned-zeros -fsignaling-nans -ftrapping-math -fdefer-pop -fno-omit-frame-pointer -fno-stack-protector -fearly-inlining -finline-limit=1200 -fno-merge-constants -fgcse-lm -fgcse-sm -fgcse-las -fgcse-after-reload -fira-region=mixed -fsched-spec -fsched-spec-load --param max-hoist-depth=30 --param max-inline-recursive-depth=8 -freorder-blocks -freorder-functions -falign-functions=1 -falign-loops=1 -falign-labels=1 -falign-jumps=1 -ftree-ch -ftree-loop-distribution -ftree-vect-loop-version -fipa-cp-clone -ftracer -fenforce-eh-specs foo.cc

This is probably not what you want. After spending four months or so of intensively compiling code for systems with small RAM and small processor cache, these flag options look grossly inefficient. If you're doing cloudy computing, credit card computing or working on any system with multiple cores then you'll very probably want to specifically set many of these flags to something more like:-

gcc --param ggc-min-heapsize=32768 --param ggc-min-expand=36 -fstrict-overflow -fno-signed-zeros -fno-signaling-nans -fno-trapping-math -fdefer-pop -fomit-frame-pointer -fstack-protector-all -fno-early-inlining -finline-limit=4 -fmerge-constants -fgcse-lm -fgcse-sm -fgcse-las -fgcse-after-reload -fira-region=one -fno-sched-spec -fno-sched-spec-load --param max-hoist-depth=6 --param max-inline-recursive-depth=0 -freorder-blocks -freorder-functions -falign-functions=64 -falign-loops=64 -falign-labels=1 -falign-jumps=1 -fno-tree-ch -fno-tree-loop-distribution -fno-tree-vect-loop-version -fno-ipa-cp-clone -fno-tracer -fno-enforce-eh-specs foo.cc

Depending upon what is being compiled, this can reduced stripped binary size by 1/3 or more. 4/5 has been observed in optimistic cases. Furthermore, this is not at the expense of speed. Execution time for regular expressions can be reduced by 22% and execution time for SQL stored procedures can be reduced by 45%. Compilation time and memory can also be reduced to the point that it is possible to self-host within 512MB RAM. As an example, with the addition of --no-keep-memory --reduce-memory-overheads to minimize compiler state, compilation of clang-3.8.1 using gcc-4.9.2 goes from exhausting a 2GB application space to requiring 360MB RAM.

The philosophy is to squeeze as much code into L1 cache while reducing cache misses. In many contemporary cases, L2 cache and L3 cache doesn't exist or has contention with hundreds of simultaneous users, possibly to the extent that cache affinity cannot be utilized. In such cases, available L3 cache may be smaller and slower than L1 cache.

Anyhow, let's pick off some quick wins. gcc and clang have multiple register allocation strategies. gcc's default is a nice conservative choice which compiles legacy code without being pathological. Unfortunately, for contemporary systems, this is a completely borked setting but it can be easily rectified with -fira-region=one. A setting which notably reduces compilation time is --param max-hoist-depth=6. I am under the impression that this setting reduces the bound for moving stuff out of loops. Why would we reduce this? It is, unfortunately, an O(n^2) process and code has to be seriously awful to require more than six hoists. A pathological case would be useless code inside nested XYZ loops. If you're compiling that then your program deserves to run slowly. Anyhow, reducing this bound makes a difference to compilation time without significantly affecting output. In combination with -fno-early-inlining, -fno-tree-vect-loop-version, -fno-ipa-cp-clone and -fno-tracer, program footprint can be reduced to the extent that compilation and execution time outweighs any disadvantage.

Perhaps some of these flags should be explained in more detail. Compilers typically perform a number of transforms on a program. Some of these transforms may be performed multiple times. A transform may be scheduled two or more times in a row or a transform may be repeated after many other transforms are applied. One of these transforms is inlining. In this case, it is typical to place the code of small subroutines directly in the place where they called. This saves a call and return. It also allows each inlined instance to be optimized into the surrounding code. For example, if each invocation uses a different constant, inlined copies may be optimized accordingly. -fno-early-inlining cuts out a transform which bloats compiler memory usage, compiler execution time, compiled program size and (unless you have exclusive use of a fat L3 cache) binary execution speed. Early inlining is a great optimization for a desktop application but it is a hinderance for almost every other case.

Another transform is loop unrolling. In the trivial case, a loop which iterates a fixed number of times can be re-written by a compiler. The content of the loop is duplicated a fixed number of times. This eliminates comparisons and branches. It also eliminates use of a loop register. Therefore, the contents of the loop (and functions called (or inlined)) have more registers available. Unless the number of iterations is high, this is a great optimization for processors with no instruction cache or very large caches. It is, however, counter-productive for systems with small caches or very high cache contention. In addition to unrolling there is vectorization. In this case, a compiler will attempt to perform pipelining and/or use SIMD instructions. Where it is not possible to determine alignment of vectorization at compilation time, gcc emits aligned and unaligned versions plus conditional code. This bloat can be inhibited with -fno-tree-vect-loop-version. And modification to the entry point of a partially rolled loop can be inhibited with -fno-tree-loop-distribution.

-fno-ipa-cp-clone inhibits currying. Currying is highly encouraged for interpreted languages. However, for a native binary running through a processor with a tiny instruction cache, it is a hindrance. With -O3 compilation, the default is to make multiple copies of functions which are deemed too large to inline and perform optimizations on each copy anyhow. This is inhibited with -fno-ipa-cp-clone. Admittedly, where functions are not curried, a processor performs extra work. However, it is assumed that clock cycles taken to perform extra work are less than clock cycles wasted by instruction cache misses and/or virtual memory paging. In practice, currying is useful for compilation of desktop applications and dedicated server applications but not useful elsewhere.

-ftracer is another source of bloat and interacts particularly badly with C++ templates. In this case, a compiler provides a separate function exit point for every conditional code path. The mass elimination of dimers allows a very large amount of flexibility with optimizations. However, this occurs at the expense of significant bloat. Such bloat is likely to be counter-productive away from a desktop environment. You may wish to apply -fno-tracer (and -fno-ipa-cp-clone) selectively. For example, on a mixed C/C++ project, such as MySQL Server, -fno-tracer (and -fno-ipa-cp-clone) works well when only applied to the C++.

--param max-inline-recursive-depth=0 inhibits unrolling of recursive functions. The recursive version of loop unrolling probably works really well on a Xeon but, on armv6t, it blows goats.

-fgcse-lm -fgcse-sm -fgcse-las -fgcse-after-reload prevents particularly boneheaded sequences of instructions occurring even when -O3 is replaced with -O0 or -Os. (We have a script with this functionality. This allows self-hosted compilation of MySQL Server 5.7.15, clang-3.8.1 and suchlike within 256MB RAM.) Similarly, -fdefer-pop redundantly retains a useful speed and size optimization when other optimizations degrade. For your purposes, it is very probable that these flags can be omitted without adverse effect.

-fno-signed-zeros allows additional float optimizations by assuming that IEEE754 +0.0 is equivalent to IEEE754 -0.0. -fno-signaling-nans -fno-trapping-math reduces bloat by eliminating divide by zero checks and suchlike which your interpreter, database or whatever should handle anyhow with application-specific code. -fstrict-overflow is badly named but enables additional integer optimizations on the assumption that undefined integer behavoir is not exploited. In practice, stuff like incrementing the largest integer still leads to undefined behaviour such as integer wrap-around.

It should be noted that -fstrict-overflow -fno-signed-zeros -fno-signaling-nans -fno-trapping-math -fmerge-constants -fno-enforce-eh-specs is strictly against C and C++ specifications. In practice, tolerant code and debug builds catch most of the problems. One exception is that python tests note the non-conformance of integer and float mathematics. Whereas, perl incurs no such problems and obtains faster execution speed. Whatever.

-fno-sched-spec -fno-sched-spec-load inhibits some shocking behaviour. Assuming a large cache and an advanced processor, there exist cases where it is beneficial to fetch data before a branch occurs. This remains beneficial even when one of the two code paths doesn't use the fetched data. What actually occurs on a processor with out-of-order execution is that a request to load a register occurs, a decision to perform a branch occurs, then a code path may use the data. In this case, data may be obtained partially or fully in the period taken a branch and subsequent instructions. That's the ideal case. On a simpler processor or a heavily loaded server, a costly and unnecessary cache miss is likely.

Parameters with magic numbers may not be optimal. These numbers are based on random walks and exponential decays - but tweaked for pragmatic reasons. I'd like to perform A/B testing to get empirical improvements.

-falign-functions=64 -falign-loops=64 -falign-labels=1 -falign-jumps=1 greatly improves execution speed on ARM6. Unfortunately, it bulks binaries by about 5% and this cost is potentially pushed to virtual memory. However, where RAM is sufficient, these parameters minimize cache line usage. Some ARM processors only have 128 cache lines. This can be maximized by aligning functions and loops to cache line boundaries. A worked example follows. An 80 byte loop without alignment may be placed across three cache lines. For example, 4 bytes at the end of one cache line, 64 bytes fully occupying one cache line and 12 bytes at the beginning of another cache line. This arrangement unnecessarily increases cache contention. If the loop is always placed at the start of a cache line, the total number of cache lines can be minimized. Technically, all four parameters can be set to 64 but this would bulk programs by another 5% while providing minimal gains. Conceptually, only back branches require alignment. So, subroutines, for and while are aligned. if, else, break, try and catch are unaligned. Consider the case of else inside a for loop. Both halfs of the condition will eventually be cached and therefore the total length of the loop is more important than alignment of its constituent parts. Indeed, for nested loops, I wish that it was possible to only align the outermost loop.

Inspiration for cache alignment comes from an explanation of the Dalvik virtual machine interpreter. In this case, Java bytecode re-compiled into Dalvik bytecode may run faster on an ARM processor even when not using Jazelle hardware acceleration. The trick hinges on one instruction: a jump indirect with six bit pre-scale. This is placed at the end of one cache line. This allows interpreter code for each trivial Dalvik instruction to fit within one cache line. In practice, relatively few cache lines are required to implement common Dalvik instructions. This makes a bytecode interpreter practical even on processors with 128 cache lines. Overall, this arrangement degrades gracefully and incurs less cache contention than Jazelle's partial hardware implementation of Java.

64 byte alignment will also work on x86. However, Intel instruction dispatch circuitry typically works on 16 byte chunks (with or without alignment). Therefore, smaller alignment or no alignment may be optimal on x86. However, if you want to set and forget one lot of flags, the suggested ones are likely to be an overall gain across multiple processor architectures.

Mandelbrot Fractal Animation

Posted by cafebabe on Monday December 26 2016, @12:47AM (#2172)
5 Comments
Code

Requires zlib, libpng and libgd-2.2.2. Also requires something like ffmpeg or gimp to collate frames:-

begin 644 mandelbrot-anim-dist-20161225-233342.tar.gz
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
D7=NU7=NU7=NU7=NU7=NU7=NU7=NU7=NU?TS[+W]%FX@`4```
`
end

Don't know what to do with this block of text? See previous article about uuencode and uudecode.

Displacement Map Animation Of Torus On Checkerboard

Posted by cafebabe on Monday December 26 2016, @12:45AM (#2171)
2 Comments
Code

Requires zlib, libpng and libgd-2.2.2. Also requires something like ffmpeg or gimp to collate frames:-

begin 644 torus-anim-dist-20161225-233352.tar.gz
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
A:4UK6M.:UK2F-:UI36M:TYK6M*;]!=I_`>?E8W<`4```
`
end

Don't know what to do with this block of text? See previous article about uuencode and uudecode.

simple-init Bug Fix For Aug 2016

Posted by cafebabe on Thursday August 18 2016, @03:16PM (#2024)
4 Comments
Software

A problematic bug in simple-init can be resolved by eliminating one variable. Specifically, change:-

$wait=60*60*24;
while($active&& $running) {
  (undef,$wait)=select(undef,undef,undef,$wait);
}

to:-

while($active&& $running) {
  select(undef,undef,undef,60*60*24);
}

or suchlike. This change eliminates the case where the variable is zero and a busy wait on select() ensues.

Minor bugs remain. Regardless, simple-init is now suitable for deployment on systems which do not require suspend.

LAMP Stack From Source

Posted by cafebabe on Saturday August 06 2016, @09:01PM (#2010)
5 Comments
Security

A while back, when such matters were important, I wanted to install the Apache Web Server, MySQL Server and Perl on multiple Unix servers. I wanted this to be a repeatable process which would be trivially adapted in the case of upgrades and security fixes. So, I began writing install.sh in the following form:-

#!/bin/sh

tar xfz httpd-1.3.22.tar.gz
cd httpd-1.2.3
./configure
make
make install
cd ..
tar xfz mysql-4.0.15.tar.gz
cd mysql-4.0.15
./configure
make
make install
cd ..

This has quite a few limitations. Firstly, version numbers are hard-coded. Secondly, there is no error checking. (Yes, I know that make handles the latter but let's continue revelling in my ignorance. You'll be surprised how far I can get and what can be incorporated from it.) A slightly smarter implementation is to use shell backticks for the purpose of finding the most recent version number. Oh, and, for portability, we may wish to avoid GNU-specific extensions, such as tar xfz:-

#!/bin/sh

gzcat `ls -d httpd-* | fgrep .tar.gz | tail -1` | tar xf -
(cd `ls -d httpd-* | fgrep -v .tar.gz | tail -1` && ./configure && make && make install)
gzcat `ls -d mysql-* | fgrep .tar.gz | tail -1` | tar xf -
(cd `ls -d mysql-* | fgrep -v .tar.gz | tail -1` && ./configure && make && make install)

This still lacks portability and error checking. This can be added to shell scripts. However, there is a much more subtle problem. This implementation doesn't handle a transition from project-X.Y.9 to project-X.Y.10 because the sort order of ls -d differs from requirements. On some platforms, this can be fixed with ls -dv. However, other problems remain. Firstly, the number of archive formats has grown significantly. We regularly handle .gz, .bz2, .xz, .7z and others. Dependencies have also grown significantly. For example, each of the major four forks of MySQL Server (Oracle, MariaDB, Percona, Drizzle) have four or more dependencies (and with little overlap between forks). So, you'll require a smattering of cmake, boost, m4, bison, ncurses, readline, gperf, protobuf and uuid. Ridiculously, boost requires python. Meanwhile, protobuf is mildly allergic to stable releases. In another example, Apache Web Server, nginx and Drizzle all require pcre [the Perl Compatible Regular Expression library].

Dishonorable mention goes to projects which break standard naming conventions such as:-

Python-2.7.10.tar.gz
iozone3_434.tar
node-v4.4.4.tar.gz

or support for a varying subset of:-

./configure --prefix /path/to/install
./configure --prefix=/path/to/install

and that assumes that configure is in a standard location, unlike python (again), iozone (again), boost, nginx (varies with version) or perl. Most boggling is the llvm back-end and cfe front-end of clang which use incompatible build systems with the exception that both deny compilation from the source directory tree. WTF?

Most alarming is that openssl-1.0.2h (current version at time of writing) doesn't compile with the DES cipher or the MD5 hash algorithm. MD5 has been publicly known to be insecure for almost nine years and DES is just as bad. Admittedly, openssl has to provide interoperability with previous versions and popular forks which may be in open-source and closed-source products with five year support or more. However, it is dangerous and worse than useless to have the most popular implementation if it is not secure by default. Unfortunately, plans to accelerate deprecation of insecure ciphers and hashes may push developers to distribute an outdated version within their own projects or encourage forks with common flaws.

On the upside, on a Raspberry Pi, I've reduced Perl execution time by 22% and MySQL stored procedure execution time by 45% while maintaining numerical accuracy and reducing compilation time and memory.

Unfortunately, I've been wading through this quagmire because my venture requires repeatable source code compilation with the added complication of providing low-bandwidth, secure updates and supporting low-memory RISC servers. This had led to the following development which is presented in a simplified form. For deployment, this build system is intended to run in one of numerous split-privilege accounts. For development and testing, build/Makefile assumes the following directory structure:-

  • $HOME/build - Default directory for installation.
  • $HOME/build/bin - Wrapper scripts for C compilers and suchlike to allow self-hosted compilation in 512MB RAM or less.
  • $HOME/build/repo - Read-only repository of .tar.gz files, .diff files and additional tests. Examples given. Full contents to be determined and sourced by you.
  • $HOME/build/work - Working directory where archives are decompressed, patched and compiled.
  • $HOME/build/conf - Post-installation configuration for Apache Web Server and MySQL Server. (Under development and not released.)
  • $HOME/build/stat - Installation status of dependencies.
  • $HOME/build/foo - Example target directory for installation.

In addition to this, $HOME/build/hash.table is pre-configured with SHA1 checksums of the Makefile and known projects. If you are certain that you have reputable omission from this list, such as a legitimately modified Makefile, add it in the following manner:-

shell> cd $HOME/build
shell> shasum Makefile >> hash.table
shell> shasum repo/project-1.2.3.tar.bz2 >> hash.table

In general, something like make apache, make nginx or make perl should validate, decompress, patch, configure, compile, test and install the required project and dependencies or inform you of one or more significant omissions from the repository.

This archive has SHA1 of 1fea7e2cd6222fe73f3962a4a1c1c68b77d612a0:-

begin 644 build-dist-201608.tar.gz
M'XL("'VKI5<"`V)U:6QD+61I<W0M,C`Q-C`X+G1A<@#L7/ES&\>5UL_\*R8V
M5R0M`>S[6"[7UMJ.[2HGWHJ3.%6BK/0)3H3+&$"'+>W?OE\/@`%`$3JRBN1L
MB'**FD'WZ]?O^-[WNLGX13V,O5@W\QXC5!%SZNOQZ:UW^B'X:"G+3ZHEV?ZY
M_MRB3`LM%=%<W2*4<B5O5?+6>_@LFKF;5=6M?]&/O];_\_2T'N?)^_(_H\7_
MC%'.$0'P/X*!W:K(C?__X9^/?],ZO+D\.)C/%NG@X-;-YR;_'X;):%H/TWO)
M?RT97^*_$()2C*.<$GJ3_^\I_Q?-K'7Z-,V&5>^'@X./JQ]F;HK'ZK>36?5Y
M&PIN7D_&U3=C/(Z;^<S5XQ2K+\>/Z]ED/$KC.28=?WY20JCZXV5J1TUF\WHQ
MZA]\C._:V$)T5<7:\^X%)57C'J?-,]]YUNSJL]E]YG3Y?'`XG4T&#\=NE,X/
MR=GVX_\TI_U/+DY/3YNSLK-9^FE1SU+EAH/)K)Y?CJKYI,KU.%:N*I-F;E3E
MQ6Q^B=V[X60\J`Z__/V??SGZ[WM__/KH!03,+^L&WPPG3YJJ'C^>A*5E)KD:
M+8;S>CI,U9.E]9HJ3\JX&D*:>@0;SC;+]M<Z3]W\<DOG]A$Z7YS>__'B],$G
MAZWB=3[^34RY&/UX,^[D^?.MIRK]5!T=G9Q4OQQ4U;;LI?X_?''TXNS@Q3L0
M]?F[$/77Z9/XU[/==]CV_8OQQ>S!G=/305-6^*Q]?WQ2K%/^15I37+/F[=O;
M:X[39LVEB&8ZK.?'I_?__0S"[VZ[]*0HD2>SX\,AQ!\._Z,)#IXZ;N>=X,6=
M.TM!586E6S7N'PX?E'UMK;\:4;;3&FIXUCZ_."C_>U$"#TE33ZNTR9CJL9O5
MS@]34T+PT7CR9(RO,2HU"(YFX5?OVDU@7FN&5M7DPF5U6**[.OX,6]G6;QGS
MIS\>_^G[+__P_.OO?O?E\[+/Y_#_\V_O_?ZK/]W[ZLN3P]-F2V/(_J6=]V+I
MX.6_MS<`!?#%>=&BO)ZE^6(V/EON"S$>]VRK'F-CJ"0CA_0:PF7`@BI.QD?S
M*CCD8)V7V91=/2RC88?9?#%9-/BZZ:PPG:5I@H`V@(H=FLLZSXL>VZ&`+T[6
M>_IL/GF4QIW/JXMYZ_0R9+FKQ;B547UV[P]?_?GN<OC9:J<[F[L6+4:N:=P@
M[>RLFCH@1YHCZ\LFPV0!J_A4#=(XS=RP;H"6?C''W&>=T/1TGL9-_?B*^%D:
M%OL]6Z)2F(QS/5C,EBCSN'8[>%25]9MG(S\9UJ$H\JBSFILUJ;7'DTL4\HVA
MV@#9VO[)U>AI,[8W'2X&]?AH$R9;4U:A4:5ALQUR%ZM)%[W)='Y^.MF*L>+V
M:CR!M\>#_O6SCR]ZWR$PMV<=MD;]Y9"^.#\Z.GO%M./[I&>;!_NG'[*].M__
MXIMO'UR9^-@-%SM&.KLBLDSO+X>]6K=6^LEQ_Y-]NO4/V6LD_/#DP=]GE_L_
MY-';K[UM&WBT#&VG`V'7R-B&S7^2%G3+O^^3!^V2]W\\?W#GY/A\O>++2[9V
M.ZJ.^MM.>45L;2OS9DJ@:O8>7%E\Z<ZR[&M<"IW:L5M*I$[,=-%<EFJ"T7?;
MT;L(N84;ARMD:&W;9F.;RBV`37)N-@C65I#-XZH,M37D3COTU07I<)Y&T_.N
M)O6/3F'9(O)LG=&]I\M!6]98*]>^7UMAJ7U%K]M31=I=E7VDIRFTDDJHK?%O
M6>%7"Z2GP%SRE-&3-:`>EDGGZ]'7E+!"%*M'Z5E3_5MKW6YW96*_]=LJX;9=
MM19_M1Z^4L1Z4O.LP>Z/VZ]/5J7D\-/S<[*[C9.SZPQQ"/9W3ELF\K=)/3Z&
M]+O+<$0`CIXU/PWO_U@]^&20)GDQ#J<KZE,F+>>W-&+-3UOKI7`Y65EP.D/5
MK#JY1Y_@@Q_MB.4JJW<G_8\NQA\5!3M=.Q#88K](R\&G(3P/0S<>;`K_[1*1
MQ_3N4?O^")RM>S,(8>=Y^Y&L)J!KVWF).5=?=6]6$2%I9VB88FWGM2-6T;&R
M8Q>^.S[9\<HF2&^O",+QBIW^]MM[7WV_XG6W6PJU)$ZWVY)X?)T6J\`ZZGUW
M!$!D*T2\7:+CN(N!F(:H[SMC6[&;4;MBFJ,K7Z\,H>A^5]T/@P=/GSXO/R[N
M7-Q9>JW\:Y_G[MS9]=V5Y[#]3+HY+[GOY5>A>_6^_?>7O_SS>'!9'5:O1?OZ
MG^P$[?KS'^3SNS[_U_IUY_],44JU*N?_7`I^JV+O]ACJYOSGS?U_Y\Z'\K\6
MQ?]<L1O_?SC_AP_D?Z*1^:W_I;SQ_X?S?YZE]([]O__\GW%)K]S_,KR[.?__
M_W;^;PA=G?_?G-??G-?_JL_K_Y6/<#93=@]+5H/?XKR$=JO&Q6CT;.N`XR-2
MD=7QQ=_Q8NNL;=WJ;A`$2JQ:-K2S[;HE'F]^K^%MZO\POL??_Q*,ZLW]/R_W
M_U13<E/_?QWU_]MZ_*B4Q'=^]\]_57?Y;\4&RD(^M7SB48HWW.#F+O_F+O_7
M?I?_VFO[_^.]^?85^'%[!W[RZ9O>*V_=+9+EY>+=EVXB7[7.[FW[R])>=Z%)
M;VXTW^6-YF</_Z$7D-WUSC#NW-D,XS57-OMN:'87+#.6TJ]<QWS[Q>8V9G,7
ML[F)65+M511=>29WU]%UU&N.K@Y>O]R^5+EAZ;^2\]_PSOG_&Y[_4K8Z_[\Y
M__U`_B^_<?9N_P#HC?_^1PDB!2O]G^3BYN]_/HS_+UUSV9\7UO<N_:^$V.-_
M1CA5Q?^2<B8E;__^1V+X3?__'CXR))TS=]89FP*53ELF+,^!9)^8$,%+K07S
M5?4[]PA<>)@.>F_X.;`B$D,5-S8XF;P,*J0<8THA!6)#C"%(RPVMJM6=X]O.
M"&\Y85U/WG):^>6K`]B)F*2<HU08EHF5UB5&?0C..46SB%E8DO1R2KE`>\M5
M!F^]_P$,`%T2R8DDP84WDA#G3"2:)V^MBYQ`*^H"M\L9PWB0B$U91N&=U#)P
MSK3B5GFF9&#*.&:E-)02OYRP^D/`-_>YBEKJ'+(.RN`G)R10HA31*K-DN"$Y
MF^`#*91V.CEUTUF/]F6?`7%F??\S.PA"$QT0A)I%%Q*/5L5HHXQ446S,>*NM
M+J=)&P$U2M9CB&%]VHGQ0!9NO(0Y(2E%8D5(D1D??&9>>B]5D,;&+3&+>3UL
ME1&=E!2"H-QZ'X7TFF?!,)D(&#UJ':A"F<K)L;4ROFXFXQZ#@*4B@Y\/D%*1
MQ&`DCSRZ)%VT4L3()6*)N2!]SC98+_=*Z#?U`'H006&7;(VDR,QH209AXB:'
MY!P)481LF-%7I,B-'ABKL*X6TGBNN-*,N.RSD-Q%P8C5$6XCP>R5L-*#8EVB
MG`XYQ>B(BLQ&A)?PA".RF*.)>BUVI/`^69D4>B0)/;BTV#</QG&A7"*2>QN@
MED?T),-@CK170JN'I(Q#Z>@I,D:IJ*RS(3OILLE9:!ZE%33:SAZ323-_2!]*
M^Y"L%7%!"\SG3"0EB78<^27QC*QV2)FLF`@E$:Z(4&0C`B9P5F3E,X+>ES#C
MCL`>5&;X1%`;'<U*T>M$Q#KG`\8X2=DJ1%6$.2A/`=`K$6&>)!XB8D-X%M;&
M@,UA"@-C-+/0*O$42IADI0[P2O*(2`8+:.C.50[!"$-2U('3`@![9;0F%8Z"
M=ZE$%/4^&:(R@$=2)5QP6AL"C:S)HM-EA'(`2;+?F4-&A:0O*:^CHL'%J!@T
M0]PF!5A2FDH18)*7)+"UA,A#8!P31`*6Z>)$@8Q/0#/LS6:O/,DRK,,K3)XT
M[EF)#AZZ^.+,269$M$@1IS*PDPH+K70`FA")MQJ)Y%8BH@/3<4WJM;^WVY-]
MW:>L!^3KN=E(#7O#>KQXVAN,%\GY^C*750ZXDP98@KH(/S,0&ZDME9IY)X`/
M61-&<V)6_/U+E(U81659)"BIJ2B+!(IH0A6RV!['`DK"(OR5JQ0NW^KL6>;$
M([Q"B$@T)&%DCLC,#?>*4$%8\DE8^T;26O4X`(4`%(U,%A$,(0AU!V3BL(/Q
MC`6;.`\K@5_\UQ<K60+>X@])YW,/KV:-E"]UR`N`F(]X93`94.<$0Q:BZ,E.
MT#?`:,4[0-&::^L8G(&$+@CGK(&3)8IH=``Z!M`UZ"C7\^M!`M?]_NM[%/!&
M^5H,==0KG1V`2&M`O4D(Y&B2,\I;KCT-^"_ISMRS^N>?AZFG$;RBYX;32]<!
M"S8`3H7REU1BR3(:O0',L!+2G"D=4>&"H:^5U'<-ZCME'J4+?%FB;'*`HPE9
M.:0Y1YDTJ/4.([AXO;11E`<1:`N89P+LP#L+C3*3'$F"<@D*2*/*-`>SKHH@
M&/`77Z5X*8@PIO:"6$,!N+0D@$L6Q(<+3E&C<T)]\HK[?0):J,G@&@`IBBA$
M/610AULFHT52441-(C$Q'UG:$:(W0".B9@SXQC"#E/*)(ILX[&J)--IF0PFH
M0S1[YK<Z&'R?HQ0JN^BX$3ZC:,".W$9EF%3*0KRSNY:P_2Y>4.P`,HX%H`%%
MYT2#3H@A8#>1BA!D`>&.:KMG?JL#MPEET#BC.354@YP05K+3(&:D1$(PDU+<
MT4%VQBQPB;A&Y8G4&H-R1D2.V0%_*(_41,&U\%0PD?;,;W6@1.J$K,5ZL!^U
MDF-AQEI:X(N7/)@.('A+A@(GZ'2@68-&(,G`)X!0`31/>823!X4#O?0$E<-)
M8O;,;W4@!"15&F$!*`I.1;X[3BU/`&]&D@L$U0P9O24#9/E*9"H"I*0I%&<"
MS4("$^!`?@]6@^JA3<K<4\9>)63I%0]&#Q,`"9C,7H-[&2M`IHD&#]1.19$-
MLG%+T-_<8W=%G:A22:0`H)7",:H\@H.@04A602^OJ38*AGFEE*4^#$;(J+Y"
MPCR&4?`50UDI#0!;B8115I-,MR3-`7'-HIZG*TJ!OE&=>7(9S@7U*'4:E04,
M`C4Z.T/0?GC/[>M%+=D@9U$X1#!,K#D)UDDE)>).@[2H")*,+HGZSO?3-,N[
M;-!(;X*`XX73!&B-:`;U<JC22EOE"NE-2G0$Z&4)K1Z@40%D$BX"."J6(!3%
MPVD)EQ<^*6@&A?>=K4?3=C-="2K\/AD30F(J>L<C`-6`K:B$D(X\98%W*>0]
M\UL=D+<FZ%)"D+/.YE8+%,+(J$6?@/H;G4<!WY*QR8/B&\U1-3.G`G0+Y4%*
M)E'%K,Z1971`""!A4/?U/@&M%N@6$VH6]`4(!NW0L7(50`)+Y%HX13O@"UW#
M\^5\/HUMM\$VBL";&B&/R+7(%\08D!);HC`&2I`7\)=F(-LK&?7DY\DX\8=B
M69)1_E#",^`X(?PM8!S0@/9-R&1H*8IX93)JSO736T:`#A7E()>6U&IP($$(
M]``9CXRAO(-S!0G87TMHACW2IYNF#>C!/"`9F2\9:)+0J-L,')$`J-!.:AL%
MW))WYZNMYE&9PNHM0=N'[D3`HAQ4$LHHYJEW*0#E5>JXUZ-G\^1Z)2AU%U(9
M(8P^"RT*0CL!U^%5!#*J!4=&4`--0'G623NL_:`X@BW]><"0X&@N!)(Q)(7.
M40)9HT@I@(YS;`KA&$+7WUR9WM9(%AQ%&"61<R;8C2[[0;?$,FB5)*A<"22;
MO"1AJV-$82"P@$:!]$:UQQ&2Q4)!I<H@?!:MN+,;"=/QH'"S/NMD1#0X;:/M
MF$2'Q\`-T-]3A@I>SOJ\944=I3H9@V5(4MB2VX[B,>Z"I0;+81+:3P1+(:]H
M]UHD#0(<P&Z,.7P\>KE/HJ`:O.P`O;+(X$^H\0:Q:@I7\[(T'5')M!8R$JT2
M=M.W1B*0$=Q86J@2TL([S3W()?!/47`&$]`X7C]]V6%E0UR*`$:7.`A*MDC0
MX!7Z*G`)R10(,QH(LBN"=C&%+I'`7"#(B`K8H/!N-,Z&!PTF941"K='*Y#WS
M6QT4R'(,&@&DT;5HFCB"!)S41YDD\A.-LRE5:BVCM&A;IQE21Q"2THE%U".%
M;:"GXY(PSM$)(->,0U,LZ?73ET7#%9V!1ED%!K8"<.:&PK#H,H-%*^\\FO&\
MT6!6N^A[%"F*'J3#"(,,8V4Q1%5,8!"<9@8$#\:!R8/X:%EBXUHI?"/%)U6.
MOV`1M(J!(\C182J+Y`,M"R`3/H0N/$?3T"N(NVD:.*'HKAU62M83&H#A6J'9
M52@8,5N#_E_R[@#@ZOQEX0"%E&CX(P$)C-&A="%U#:`+;9I%9=86>NG0R<BS
M)6*OE2@&2Z#4A+$"5$!-EH'5I9,!A@I6D`3,2NT3L"RAY?]]"ZV6L6@HHD(W
MY="6<8J>'A'%(X@F"H#CVT)XGVXJ.2('#:8`9&DTX"!^:+X=B1J<U"4P9:&%
M*T1HGX!6"TM1>%K2"[!!1*.?!F`![P#'R:/5`*\U8$-K(:OF%-!MEP<JX)K_
MR]ZU?S=M;.N?Z[]BZH8Z(I$MV?(KX!8:H+!*2&X"J^TJN40:C1P?;,E'DD,"
MY/SM]]LSHX=?Q)"VA[M686&DT<S6S)[]^/:\!-,"=X<@!Z(E@+(D2^%:@4.%
MW0>CN&^U%PAT2Y*%X-.Q>4#C@YP#D'BH$.(VF&$;Y@.V$%K:M'K.*A*R#D`2
M;803-E"UW^MS2\#2!G:S'P3='J)M+FQ$NL!@<P3DV)`B4QA/.#R((<3)<P#^
M;#A28&W1ZK=Z"%#!9$BFZ.5F3Q$*8I>G[ECBMKI,4G`4(1^`&@RQ0/5[D#7/
MIF%5UX686DU$N0A:O,X\+;5TH$2E!6<(8`-%@[B@B]&W,,P=!T`6!J!'=L@#
MULG8&_)9G(@$S<K-*)P6^=8`<0L7"":#EHM0L@FP!Y-,?AUA%**J8"T%*2<(
M[N0"PC;%7A3UP;MV$6G`Q;<1P#8MWV_!V?`%*IW"/4(R$2593?(H-B`G)]EM
M<<2PMM]K=1S/@=X5XKI,00614''>;+4]Q(P=6]B$'X,NE,^!:_+[CK"ZA*-6
MU4.*2JL/\&Y9B#0)@0(J`:XA).^2*7?:;3(O;M"WLUYY(5+SX.KD?YX37LG%
M1'3AVWG0[':Z-O`VZ:"-`!C-0!]3#`9'$_#<%(;#47@),]2OV^U<>>U>"Q+6
MZED<#MYI67X;V!N6$;`!7K/E4X4Z[4^04&,5`G@`QAL="B,&[-U$5;HT(.@3
M$'8X8E&@$'N.3"S&@D::8)>MHG]@@N'DK&Z_A>8#?3I0G@Z".0(2O<#AG*K$
MO9Q4Y`OSPJD[A4&BX3GP$G_]9K_/:6BH!930PJ^%8!DA65]`K3+X$DU%F"1C
M:9^;YQF15@"P@=`4T477=>']NC3U@-MFBVHFH`PN,&96C2F/19.<3(&`;`@9
M$&@7QMQUH<FVWP>*@_^&V`BW8W<$`#_/G?XR!14#P@3`.P`'D]-T$/&U!$+:
MED=ZT+%@+H$*O=SU$Q6S5V_U<E."R`3FV&W"[;<M0*]N"X:M"^,!3E"DZB!<
M02RXIKP:<T=G-!V$:QT'$**#>+A'L3:B`0]^BY,IZ?5;3N9G$*KQ*'3-1,07
M(M:FS2R&[9H^Y+()+.%;,,EM,J\TX=-UX`HIT!6VU>SUQ4;4:&PKF4TJ8`'@
MJFUW^N207=L2;:`R!&9]UW5:/C01L+.`K+3@&:2:S<*9`G=WH'4^0M%>4T!@
M/*OEM0,O:'=IYJ:'"+HI1&Y9CD#A*'HGXI=1-$Y(>*Q.3JI'@X_]KM^"],$Q
M4?P#5]\"?H4SZ'A(M+U^/L&P@E2._%H`:QV$4("P#J06H![<@96";7#=H`E-
M1Y3:S]W:-([2R)L%</.=`KO!3@(T`>-!EIRV#Z#$@2X\1`$P'3`<W$&@V.IG
ML>'T*CV74T!=4LQ,FH$%'.`$1/N=7MM"7!<X?1OV!\:C[0H8*VA#+Q^-C(7K
MTS)+LS3&#\0$V`\,&D"%86$0JR',`VHA_,=AP+NPJ?T<A^<D.J6Q-^B3U71H
M8KKCP0&U8'51)8BDYU!Y,+5I]7,LKN<PS=)4!2+8`'P$S!)!J]7I$R=HOL-V
M1,MJ(=ZDF0*OZ:REH,;.8&:!VX$4@++Z-!C+$>;##_8Y3*#5I;X27=Y>H%)R
M0ZY+$SV`W<T.`!;B`Y];#DP.WNT)MP\OUH:R.=9:"K(>""'\'NQ^`-C<1_#O
M=N&?K9X-+;5IHCKH0IK[^8A50:68I;3:P"4.K"NP":?8%]8;6-8%Z*)^;N*_
M?K,KUE)05DH0B.P$0$=H?2MP8.#<MN4!!,-B>'V:A.TB>-!49K.1K^+%G!V.
MW[+!30M!:QMVD48-H,^H%0(%WX.?["%.ZV4#2N\1<\IIW]S._;.>[_;K?[)U
M'G_3^B_;:M.>GWS]C^7(_;_M?_;__$W[?RA(I_7QSQ\>'+&3U.5OY5(?=L+C
MT73#?;UMO75G?W^PM7WTZR-#KR*M[/_VVUS*SD[E^:-RRMBO5'YZ]4PFT@X'
MI))$5H[L@;JH/#QZN/_T,1[+;$;#G;K\7%2>'!X6:4$457Y^\:I(&(:SRL^'
MAS\_+Q4<1M%P+"K9SHGB`1V*,W.'HO+HX<N'/ST\*3W*)D(K![\#=R^GJTBI
M\NNOOQ;/WKU[1_R,INEH(@_^"Z*8'3\[V8?5&D+1:&^1/+=OXH['C%-KZI7]
MPP.YT'I@'K:8&?@B`,R91E-F3O#+PQ2)T6244H`W$7@R"D$(B6%D"C<>7YFC
M$'Z2=BN9P43$0T'3M9#M,$V0,N2`V.-)=I7D5V,W?^P&H$AX/')]I(UBUZ0*
M1^$@"H5Z4X*Z^F8R%7SQWM2E*'$T#)'Z7L114J2XJ-W0#-U0IZ6TS8J2)K3+
MQPP2DCR3H(O@:40M0XEA:-(96K1C.QETG#QQ'$73^037$^-D8.<)_YI-INI>
M\@4-16>D`Y109]JQB7MIGD=D]WPQ3<\'G;DGNE`L*&0;70B=R9K+-`OC:(Q0
M>S01ZE6QB&(?//3&$7^;E!+R1J`[O=@-^3EZ)TD'3=S+7D4,%"QV[60:DQ3$
MQ&')'"^:A;X;7PV<RM'QXZ.!N)S2T6FT)VA0+71J;VL;NF#(T3=UOT59JNS[
M[YDNH@[)0J$M=<6VMC,!-.;RZ<.89$Y]O91W%B8B90>/#XJ;DY>'I2>'CUX\
M/)B[1_7G[D]>/2GN,^I%"K665(HP,B-AI,Z)::N5W.X#)6/DL<ZA5;1722H7
M55\^Q3WGZ`92#3I><Z:V,]'^'GX.W8PDA&A9+`6_$MJBQ(5/FY\B1!KY\Z9E
M>B)U=:F;LLJ)]TWR.FC5C&P$:N;3/J0)[4J:0#88%:`M6#`7^L`"-V1NS,_I
MQ%`HB#^*I:9<P7B\.AZHW9N"U1XH-@SNG[Q\].S%#_?RO2E;EVQ;/S0^X&YA
MC][UO=+9<W2VW*XZF>_#`ZZV7[&&/&?S=.=CW6CL;FVY]Q[XJY]X]Q8V3VWI
M74_;#[AA4+\63X+LB6\8Q@=YYN.6T.<Z;@79A?AV@#MDT!MAD')_\`.2KN]1
M2W#+^&2*Y.`>;6S9NBSEO+Q6F;)=1]Q`T>S&-U850'Y7$_2N6<:TW6K5J+&/
M3`P!/YEYP6JOZ]NP;1_=A']$"/HQ.7<_TL#.QW-NRYRI.T*GV)5'SXX'Y5*`
M'*\]R@!=>G5L5'X]//ZEY$"B^&T%(E]R<(1WX2->/!G0(AQ<'3\>Y`MR3UX]
M.APD,S^J5)X^/'E:B(+<X!3'4?Q!=2TDXO'Q,:O22DUT_`/UEU71"NH#>:2@
M>E:])W<$V=>+'3DO7`8)DDZ:DZ8H(;9^:_HL>VY\H"&6[6<O=JM@$Z)U9GJL
M5L7?+(>\81^KM*5)UGJ[RMTPC$@5X%MBD42SF(L5A>I5`SU&1F%PGT2>CZ-$
MX%5YZF+=9$.2<VLW(V,9Y2V&*NL?K^^^_O'TQT:4["HR6E1TB<%_&B3TKAF<
M?K`[UUM;C5%D?%A%N2BSJY\:UZ02]KV<)??!)WV*:6D!_CI64`XF<U#+%[LH
MYX/LG4^UW\YK:7]V^^U/MG^.<E%&M]\VKDG1JYH;>SE_JK3U3B?;>;)-?+@Y
M=Z8KI6+$`#&PKJ\+B9!-@#0N\%7N9UPACK23E1A-]E?MX:6WB02,O[Z^KE4J
MP'![C%PMFSAL")-!4QOXX6R4C)E<O\ITO,PX.Y*C*DP.]S.Y`I)E(QQ,#P^S
M#%LRJ<=RD"J-S#Q5C<U#H2_T)0WU,QJR8Q)YTB+W212^&5E[E6^VM2,GNT!&
M2&[5+CGX##ODVXGEH-@B:A@#M_C2[Q\_-N2Z\+O2=A%5`Y*KJ1OYR_'FK>V#
MA[\@MYFPHD:5"@?2"?>RI,HWN:U"OZ`>9`@-U:]5XX.V0;7*-S',11PPG:%Q
MMU*AD+5$9YO[K%ZGRD[>PC,BYY%MJ+CV#*P3;.?.[W<F=WSSSM,[!W=.SHQR
MD<VXP&&]IS$[H^T`.3,*926^R.073PQP1S4L+#GDQ3W,6V^,DG-6F>8\M"Y7
ME6W)Q;HZ[ZA9=3<K(D^$K9VQLZR_<A;<+7S1?,LI]C7-<(:(8<1-B#<!3P+W
M-Q`A#W9#EL9=L.$C>[WX.OZGT@;<1W16>H66E!7E)419QXCA^Q&ZMT\M+Y>A
MNBPWPT/FYL:Y+]_?D%6UH?)&GV>Q-Z\5W^+_*@*`M`&5DE#:@&KH;;W53,U*
MSY2)^]'03E][^P?XDY^8,:+(<#S.C\)2AB\C(>^6D``9NS?G"/-1/Z5CYI2.
M]$@KWZ31##(\7T?"Z[AY?&!(/+ZUC9C`6(%UY<$!@NJ4L&06!",^(M@[$1-`
M6P7E`7)IXSZ*(3SD@@[<^(Z)D3S7@P[4]P3B!.W_"!E3Y$FYD[?H4T2H_&T=
MAHG^?P.R):MXH]X73@5IT@C0QIY<NS7$BJ&KH=[S+GD?WJ>YK!Q1)K(C8-_N
M6/5F4(7FA](!JHSK<MI93OT,#[;E_0-OL%W]Y:?J;O6`?GZFGY?T<T0_CW^"
M!%"M/-3JK:>KM;4U'5AD;;;O4>H/`]MJ.I2ZLV/(?`V9DKWK^WB;$HTZ\.\?
MR'6JJJL1ROV!I6VS=2W/3,A@1A9R+-P^"$9B["\#C$:.*W+H+7/^89\"3DS/
MKY+!]]-M`G$7HSA5U[(>]*A<B3QQ1V6]GU?5^#3RA1XLBER=C7P!W;C:+<Z7
M\?T1:8H[AK']WBL88:JW(C`@):++$<**G)`+FJ-P-)E--J=EJA9HDG0Y*R@N
MZ63!C4U;G+K)6_45BAG$;1R]&U^Q=U"E:)9^:3OS6EW76$VI?$U"`:EQT-[/
MT3BI9'[`S+?_:%DAX*LA?AZ#W:Q@!+>!<,5E1M\^W<VTK7UJT#D0B+/'(ARF
MY\@RB69A:MS/[_.,$E&[%_"@@RRU=7I/%Q@4&:]54V3.+]/&S.K35T^B,0!*
MAL[EJU38EVO5O+A"3I=51<HF^:`:DR`XEU`"D9EO8(70XK&X3&DUC4+2$O7)
M+8[J4OI3&JD;QJ/T2KD9Z4JWMBET-PI/*"^.`!8E`+DK;T]>/3$(`OQ1OWM:
MFR.^_47(?,-7KH'MJQNGFY]!A%NV*X<,&L,7$4+!9[O,='M/@2B=7R)P6-2S
MSVRR1),-7UPTPMEXS)H_E&ZR\9>SQ60J<PDC-)=>1G:E2KW_TEK5[_X%M1E^
M7=7QOJ[J7'Y=U1E_7=5Y_U^NCH[E3(1P>254O+^N$O)%9,+.&OLT'+HO)]/2
MR[1D2+QQY'UJ)$3R0*'\TL"(:MR@)C=JULZ&'$&Q/YM,)W@#A2T?&44R2>-_
MW7AB-M1.SH:DMVS6+*-4'1J_O45UJ'AM]6OLTFLV&/K)2-8^46D=)RH/:)*X
M?';'*.HT@V.47R3'@70$_B?1_'.I*8]>UI0_BS"-UV5TY3=W_U3JNLO`#'.I
M4^7<P=S(W+F<ML_ZF:1FJ1#ICZQN\:@0"Q(2:L\_DO)72TIIH.N_*BKEWMY4
M7A8DA(2&P.R;2>3/QJ)DJU1#U`16J:+T>@WUC861Y0RYKTHF%#^7K*OX50OH
M,MY7!_-FLWWUH^?_*,-?J@S+0O\=VZ=6[;+'2H!VV9&;\O-=6@XEO\XI=MDS
M51Y!I9CRD;*#&TAJ(9)3(HD`R6+W;P1?:OO`G]3^_<,7EE&.QPI-K>CF[*U5
MKT+)LW8OZ/Z<6=B,E2_1TPL,3?]_<W3!`%:R1FW*U_1FQM(D%ZU$(CX5TV+R
MZ*JE7U:34V(TN$Y%:.C=$^.1N%"#\YZH,35I9L[.YLO14J]1<,46RH?LU<M]
M^B^(X@EBB-_QQSPX,!\]8D^?[AT<[)V<U.8(F2&K_<AJI9F.A3%C/7=!`SAR
M)$E-8^MU)A^<W6M#SJ/=_:/^VGS=V#O]4=WJY_9N\^O(T,AG:O)!QZUM6J]A
M,,U@=L=JCN;_.:,Z7=#`9!/_6OCGX%\;_V@&O6,8)?9<TYF^V53/?+?HSJ#I
M[0MW//+KK\-\0*Q)TSF9S)3G41>&GQ96DMTP'%42YI(\0CK/HR2E\V\WD\X3
M+67).54E*YM+T#J948N'*.G;_S3HZ[4-M7BH+#NN^?Y4___://U@[;9LZJ7R
MA)KJ'C7+NV4S!*HBY8VL%C3NNY`U>T39J\9<A^2/RIU0[H(LPU_1!26FHPO&
M$7?'E)1A]*SZ^<A<X\*-&_$L;(0BI35(9&^6,Y4R*.2H,HR"V92-H])[ULWR
MU\YFDB5F<E934_W/Z0BDTGR_>K%J1[G:E0KGICZ?OT3=G%R00<D_9(!8O71M
M61:RT.1].)T[!;"<:9G(L$QEN!&9X2HZ?&=G[F:3ZNSLK*A/F<YP(SITHF!E
M[&_`L;%?OEXB/?^8G#CU?B(GCECY%*Z*NEDAS`>/#P9-$"X-0)R\/!S8.FG)
M"QI+08$B/3^``9\[,!?+:\>X&M?JVJYRX?6&]M#UY!R%]?MJ&H<(_UOZ4_M$
MO1:!H['`J56[Q6[,T:U,*6%SEC8W9^G\ZV[+VH7*+XW0T?H8&N`Z1]C'NNTV
MNWLK.KEEDJ+L^KXW\A@$?7PE5\GBA[[4`1_$F9NXS'-#6MQ"2ZBD]?$XHSE,
M&O'DY\.8%@K0"F$*YF*Y])-'8_H73^07`QB?I<SGS!=Q%`2T^%92\6<,F`E<
M(Z<;N'+E.D5I:CU9,$G5-Q4"^AA"B-0XFK`A`!L;^7+]#GL[&H_9.&036I0R
M<=\+-H'3]`6/?*&-[N1M,`HB!J9-4;6I"^?#IJ`SC>G+2!.YN)@FHL(+%J,:
M>!(+7$ZH;'*.(G(9+Y`;WJ26Z]+W*\(AK;>8L-3E:D5,*H2,L11V2-4"ZO2*
M*6.-VJM&SL+1O^DG3?!+%:(/,-!_,UWIV4R$\N(=9^_.P5ZU#/H=+;8G6?<3
M=NG&>/L5:B[-BC3QU*V&CLR7NECRX0TXN3:'%`*53[5\+K<V7C?07)5+"1?)
M$[HZZ[2IYFF92>`*&DQMTC1OU+6;S$7I:)R*NM[[9JT16+0"[3QQ`SN@J"_K
M_V>IOR*BM+61Q+S!9W%,,[D+<=*-@R:?1V@H0EJ[1IV87(5PP,E8B"FSK5O0
M]FA]K<E95:I"79>B)5Q!%!$GVI8U8>:_F<W,*_IQF7G(S!/6:C+S.>LXU=NT
M#!8'KY'1GAX>7M=;JR2H)$#9\2L5NECC0-JK9&<^2;]6+E9=[2*RW2((>P>U
MNCQ!7H;RM%LF%L'HDI50[/Q\@QPU6)3\[/2<E:EVMS)Q/J,US=6M<6[=%F>#
MEN3'=%5PM:K2Y=JL'NY<'0XX:W;V?%Z?TGKE+V3#0-<$));YD"YW:7[@2X4N
MU[-"5^G3O%C72F=U7].*[%LV4](P36J+.:1/U.2M1RH0A3<6E&[*O5NA2WJ?
M);M)(N)T,R;I`X+`(WY;%LVW_<OX::_A)[\]._E:;LI4JG>9]YNP+SL)KH*+
MOTC`;&LE1VBI_RTY0B1*'%%C#*643=1NB2.EC?H5??T9EK.UNK'9;H9;-EB3
M6=<*W2>)_G1H>2%N?BK]=_IS8\K49L>\KDKN0Z>6DN5AJ!5<_:VJ-J=#&^75
MTK51WE+G?(8[T:76^)3GC]X\?_;3\</CW]_(4K5"B>G8O[U"@O7M0@&CMN"@
M>M8:/[W21_%;6QNY>N-SK$V1SE=8+#1T7FNUH?>B**7O8Q)9?Y3(-/E927`E
M*XM+-XTF(UX4R[:?)P.^RW=V=BE81""W&WG_XO1CTA"2:<KM\(/EI2AG*Q6(
M#D'46X"*13[R:,0-9C%OSKYQQKEINTVK4IY"+%9(;%`RG\23[?^$6G.^F0]8
M*:EVD?JIX&I.P_#&=8A-52EKU<8C,(L+*B5?-G_["H;J:*5>5T=HWC#-M4;A
MBM%I(F+<.)R]/'*M17?9MA4=OQ3V\$`L2SL2E^3DR>&AH3X]H(9:9513-)P^
MC[#4;O/1/KWPS;,7)R\?/G_^!N2>//MMKJWTJBS;_ANU9[Y6VBA?*Y[^]MNJ
MY\;-55^E>/_7WK,`MW%<1]FQ(L%2(LF.K,AQLB'9D!1UX-WA2WJ0(3Y'$A$(
M,`#XD>($!(DC"(D$4'PHDVIBV9&2JI*G<2=V+3=U[<KC865-QK+I2>JVSEBU
M4\N)U;&MI*KCUG:GXSIIQLXT]C23)G%W][X`[H`[`B0EYW9&(F[OW=M]N^^]
MW7W[]JTJG*K<J7]10^S4/Y2D#L*H"YU2]^F1.JH.J2MCR^JBR%.Z?$F$"'B;
M4EGCS:31IY#/D!T!+?+KK+?8=5.LHL2(?58I,'+?'5A<Z>8R_*Y\*BF[$<:$
M?Z_E:M:I.%/@#MO6N:S'2)0GI=SA79%N:6M*FQ%"H<;\<>#E3V]D>X$8E88U
M@?PR'/@F&\\54NB\DQ(,NJK&A!_4>UNBH;9@TZ3:FJJ*8"N<A,!%5A=B[HAU
M1<O&JM@TM194:=CCVJOF@"E.$,W(OBCU(AZ4,([5J0;=(7G'%'@'F8K;B53M
MCV++UC)@R^X(4GM!FR:K&"?MZNRBH+6U&RCE$_723IC4:*&41S94>6.'2T[A
M0<>BFU*V5XI1`NI4;P(>#33*@N^:^-\VG797!4*$*`>5=-C,NB@1$*'\3#(7
MGQ6Z4I:#SY/AG!);'!>)25JCQ2=QJ"INA38Y79C/LJYBFHMC)2X%9^/Y`T1!
MS-?1@';(__QO^THVH'UM&U"Y1?A2Y-,-H2U*YQP"BU68T*5+/TSXMQYA4K8H
M("QUVQ00$@U,4!J,U20\UKT=(R"JAPX<(*]#C!>K@1HIY*8)_:R[*Q"2.BC`
M.GM!0[VE6*,F]%.AW@I&+HP=@6LT:VDG&R&MEVR$0Y%R?M4FU3Z5GIPI)E@I
M.`I<JJ`7ZJ!=0@7%!0O*,'/M:)XN75>J?SV9E7UJ+EE:FOB`V]*JO6PN(P3D
MUFB%J&@>_GN8S_^"A$OQM)!'GP0!NQ>]1;R(?!F@TL=\GIA/QY&E+ITA<I/6
MCGJJ*?11@H7PB4:@:DAUB/T49RAH!#+)#,!_J+YFJ'[`0ZLJT>#9(/2Q+M<F
M72>P!1P2/U>MA>*<6;8O(;_3HFQS4';3!'*C%T(SMA$A./3&TXFN3`YJ,2$3
MYLG0PD^Y$Y)]J1DVWX4N=(`<WY4JL+.Q))M!\2EA!\S@5LR;)R?-&73P7M@[
MH0$^X#@]A<+$JI0`JS>?EY>!,W`IL_,Q%.HT,VF>Q,[)&1RY!;E)Y95+P:2J
M<X_B`D1U1T2T"FB"ELVN-,'+Y^6:/A"7*=KL(Q5!/:WR)TQ;%=M)MYKQ1'%;
M%[6ZEE%)Q8IJ!L0H5)4)=D[=8HK#Z$*:?<(;G!%ED`=W&$XS?:/^Z$!L'QQF
M71-%%-0J(>1%(H'RK*%P*!KR#/?)\KW#X0@3@>5Z`\,^AAO)2Z>[XF@H`O-C
M>CD<'`'0/_[1'!=*]81"D:BK3=25PKZDXMJ[3?@JS+A]`7^0<96MPX3WS*"'
M\?D87RS"A$>8L"O4U\>_"@U'8^ZP=\`_PL1@]X6A)HHQP7Z$BY*!>`)N[YZ!
M4*`J$#/F'ARJ#M+'^)BP.XIJH@XTY`Y'_5%_*%@!I#87DVN*TBN=JKVTF%KX
M#,GJ-FOEH^H)HHJYSU0.MRRKY*JH#)T:H+K8U]Q=0EJ`5%E5*'IYX6:LH0:$
M(<"O+%MM)9O'`G"@JU+"VG0H%S6=(D3M[A"N^5)1(RNK&\:B8;?/$POM$04E
M%@SQ8N/S1]P>)'8#[C#CTR0D*A>>F%KX%Y(\<*.ADDB4@U[6`^ERI$(N!TH;
M):4;=`V2D-*>6>'Q4N)MOM@UX>U2;E88!<WF6N,?X_-'\?C'UUF#""C<96WB
M\ZJP].4UVQ--39J@Y38=31\("VUM\JM-VO?MV\=I=LZX(O%-0,S"_BQ^)1.#
M""28320X?A%4"2J\*(%&\6PK07&N`*?,W8%*=I:@A?ZK!!??</`"8W-<77+Z
MI&Q?254A259"3>?V5"/SM\(.J1V3OQRJP=72JR1Y.:W#QB5I/@&7Y$$EVE15
M39DRX(5R<Z'L'38+5IK59!#(_J%F6!*K@ZY+*P5"6<HJ3HCC+#>(XY57J36<
MG\J49O)C0&DFWSP0M109VA8C8V25J;"PTM/HBJ&V,:'%#T-/_+K*:R?E`>OX
ML'T;A54D'DHQ%.HP^)`@XHE$CLWG7>+./'R!HL`2R5P\72!PG&:H[85#(A9T
MT+&E'9T!4Z\"KD%YB8"8!K)"BB"7R8CN-BWM"]51FI,+^K&V)U<$ZT0MK!,+
M]#+0WEH+[:W+J>Q,+:PSR\&Z4`OKPC*P\B%**K^*%;.0&]'8H_"UT@?QQ&PJ
MK0@-\M/%0B)S,"TP-$TJRSH7+E[9_"C7&HY8]]IH#9TRG4JGD--*:H&%/_/H
MDAZVX7KA2NJYBL%$ZL^R8:5TB!"1H$V`%>SYE1LL*N\[KGO($-G`KC(Z5);9
MH#%"X?+FAHT4C<(]H0UWXT8-!>0-&SL4<#=L!%'`W=!Q1)]R*7-*D&Z^15:B
MF67Y-&KSQRW;\:LGP`"N=8W-R/RT%$D*$"%L[U#REL0!27S<'7T+K*(O]C)*
MK[HWJP-!S2AJ>G!I"YRF!Z,4*TW#OJZ29Z#/XT?>&!:K"?ZJ$MI"V_E.B*,&
M:\G##5;4)96$#41$!MP40:,M!UF&CJK1BC634.FKH<_C([@YAYI_A`A!-"*D
M(!P-$9L@P2^9)*%,5&>7Q4+:^>=BGLVY\$%X[G4\GT=A'5QYRX$<I2*Z.FI;
M18+T8JDI1KH1:I,EW6@EUPD5AVP)H]5,6BPQDI981'W>)MX9I=5$6,:OVK[A
MI$^C\_?R@]6(].H:1I1F?B43/!SGJ[D_[`Y&@3L0`$-A_X@_P/0S$1`*XOXV
M[P+1$&B#'-_6VR8*1QOP^YA@U-_G9WS`LQ>T<>S?=G.SRA@O+!/*Y[P29'7G
M;MU,)=<A0HS_YC`S$MK#Z*.T)DFJDQ.5^8B=K-Z[M8:/(%L@!N=AB>BX-V42
M'^M5UR(B?<JZ_(HV^6I,I*MT'2:65$Y:/)N#(R/R*H>_]-&C0!#$48<)EKMY
M&=VXG-/@8HEJ7BRD9G#UK2;A45T[\96K3W%4H,2%-H9H#A5OYX7/RVJ2%"QE
M#KO,4B;QN:>QC6%1;0Q<6H-:@\-51W-@.[G3;'&:T"^J?A=H=.=AG5ZTRH9Z
M%%M".,!7N1TE^<5BDI3(I)$#"TUA0NF&$$I?'I2B/W)ZQ*T)U*-ENQ6HUN6-
M,UTH9!-PGFTUPT4I=Y5[O1JB4O0U?R"*A[;M69[?-`$+GNV:@%4<1"OA*[8'
M=6S4:MF`K;G1N(+EZ3P'@SFI`:J-PZ.FUF0O,'M5&2$0>]3>_YM))7&)59RC
M-;&9,'V4A%;?$5J55A6J5T?#CHZ.=G2)>+C&R10+!']KII[&*CU.E4RE;R5R
M[`P+YUAP1$6WOYEP9FE4X>6>JY*CKY=\C*R$U@J'43P:*D_ERZ,<\412:T!D
MO%C(K#:==(/HO"P[T;**Q*U^Y_7HU6;BZ3]>CLO.!/*,KYA+*^9:8%4.'CPH
M7X-QTXQ2:$$_*>"HT#N9!$O,6>&4Q6I"OWO4C.24#@<9A$BA"^?T,6@FH45Q
M(A>5=)([_D:9N"?UX4?;Q,7KQ39S;T?M&4'Y,3E:\[R7JVK=$]]T4ELC)='$
ME"X_K"Z]P&V7K#)R2_5M6./)/.+2206'.)A9;Q,GZSZ*F%1QYVPRTN6><%0Q
M[DYRFJ3LI+,KQV8S70TM`S&CPV9#?RF'C93_%5(313NL#KN5HJP0CJ)L-FL3
ML*U&`Q3SZ$Y"8/1_2?_+CR'B:"#U]K_=:E7K?P?L;]3_\`=B`AKVO]5"VIH`
M:?3_BB>"($K.G`JG%!!;Q`2-'\<!'[KX"R9R,;1M#C/,&'8CY!LK0=H(T@XH
MLL=JZ[$YS*)@`W11!6GJ[.QL0#%V@H0E=0.RN\=FZ2&=9NY\(V0GOIC>7D#0
MMMTT#3K1'SOH[34!$P"@!?C8J7AQI@#ZO5XP-1-/YE&VOZ^=C\H6&ASR!YAP
MS!^)]0>'X=!L(N![$&&BR#%@,!04PKJ!TM1,)`$Q%9]($7-L+@^KZX)+W*ET
MALC,I@K(!V26);(9'!68RT>Q]R<+1'PF%<^GTLGF#E-GB\:20G!N/I5C,[D$
MFR/0D5T^#L<41)9,2SDNNU7,G,EDLGP&9/3)`RBR1X%%]Q3`*LSHJFHEG4D2
M$+.%Z>(LG*;,3L=S"6)J)A,OP(>I;-$U-Y6=LR#Z/A#DH3L`7/'<[)P5TX?H
M)""\*Y^9*NCJ1%*EH!H%X,\A&W,A5T`JC<^A\`XLG.2@:R;0)4/)'+I\`FWH
M(;(*&1"?RZ30]10S>71S1#Y52,VQ>0XCE`!\/F?$'>@/^X,^OJ":I#3C)N1K
MT7JH%/++0GV9H`\6P#]@C/((B3$?XQGNE^%4PD,H?QIF`JC>$(,_V!="[6I1
MK$:GUL_S:E3(:%!5%V-C"OI""/2X&AI#M:P/BLZX0@G4K374Z;P"]88B,2J:
M0X"MJ3L$P"K:0XZ+4/N\N@:1H^C4BD*5&I$6;BXR,#0\QD]"],R_IMAX`2Z_
M8WFVL$)3+\42Y+,N:P]I,5N=E;,NNWTW906=Z(\-S[H`3^MP%E]*.(E,<'ST
M/_[2$\AQ13:_&^38V<P<"UAD?&/SX"`+$AE\7]YD/,>"^$2F6.!0X=N3<+W-
MJ%O[0F'&[1UHAQ\"/D`"$*,@`#&.`?`'@R%TD@R(40L`'P>!YP[8-<%0%&!^
M;CT$T7VY+*P!#\<Q@1`#01$2>=)XT?80\(1"`=#<+'XZZ`[OB;DC,;=OQ!WT
M,K[J>"I*5"NNKT^Q/"808=H%)+5P*%=9X-E.[2W--ROP1D;``.,>`H-[_1'W
MX&"X7R9$>MNO<SFMU[F\MNO$9`OD5M`^Q(3[(O"#0;<"4VDL5`=]FHBKTI25
M]($R^F2*R3"%&?:?<ON/\KF.1MM_**O5@>P_E)4B;10-X2@':;<8]I_52)Y]
MT]V4>^]G(GOW-)_>WK3NB=CAZ!;O^^__[K9W7GO]>\G7WABZ^K-_>2-H7Z2;
M-P^V'?MDY.)F5Y_W>:NKY>6!JP>;IC^1./_PO8$3M]^^XSZR;\OTRTU7;6HV
M[;\_\IXUL/7ABSLG=FQYVC78M.[![P?N2QUY[KD=6X^=^E!\_9UD$[BK=7_B
MG/6NGY[RK3L5&E@(1?J^ZGUQ\\Z%;UY%[]PW:SEY^)4;]YQ\B/W;[WSE[P:*
MU.`CAUL7P3'ZPI9;%N_Y\*[1BV=N^,'U^W]]\=5_H[=]>@/8\LC1^YQ?VGC[
MN9O&'W_KMPNQ%W9_]NVG=]V<&#CW!>>?CK?^=.#\;[[[L;-/_-#UHZ615[XY
MW?[NF8N;-HZ8'GUSA_MSI[L]1R9.@P<BX6OS-[^]Z[_/#[[S\S_/O3NP:;'%
M<\=X[YY_W.!9_Q\;[WOFI:-O.FX[_BERX.S$B>O67?.%-'7=U;\IVA_;^<K]
MJ?^DO_='7[W[N=]^A_[Q^3SXY_N=BX\.7=@X=<.S\SM>N,-YY$O9_W4\Z,L=
M.K;MEL3SMW[[#M\GGUR\SMMTV#)R^[];/C3[TMUO?,3Q5[$-7['V/?7M+Y[Y
MUM*)7]J.]4Y\_=X-LRT/OSSU]CMOO/C6'U(/O!K\$_;Q%S[><NW1^=L^O?16
M^_]U?.)O;KKFPY\?>>90\!>%>Y\\?N]HX<D#_^4\^]#\AL0Y?_#%(\\\]<:)
M1U.[F2VGMO_/$Z>SK>[-FU)+EWZ46&\]UK%^[X[!WM'W?O;$6/C"KR;L)S[W
MTJ$`_6<#\YN.G^D?CXP_ON-?IA;&7_B'UGO6+?TZ>]IT[MT[?VG9:6F^9_K"
MTH/?(-I/VI>^E5U<;&OI'7B`VK5E<V]J[)K14\['FA^XTS-\Z>RYL]O_VM^V
MZ:GKUXT5SRQ.NCU?ZSYR[9GU;W_^L7^Z9-^9>B28O72!2@Z]N2VUM'WH+\;_
M=;Q[\\2NSUSWT4U_'#WI[+SJ)Z]WG+TE^1KU]5,_.+]UZ];G;UJ\=./=7SS_
ML<Y???^C2S=_X\7?1:_-_?B:X_NZG]TQ_I/)G;,/4\>.-3\T=O'HSW9][?6G
M/O*+C?<?L9[<G=OR\1.>3[VW_]7O;OO[2-_P([FE"^'V'Y+$]MR;FY;`A<*!
MQ[+-ZV^X>FA#W]/KBZ/G0P>Z_.SQL\/#MLG7?SY^X/UG7[TK>'WKMN=.'SW\
M^Z;_*Z*!UVW_MZOJ?]).8_L_9;'2:`L=V?^M:/_'T/^K8_^7=S;7\UV\D<$\
MG<VB):"-H&B"=`+*V6.S]5#=BHO,VFCL>*WJ0&@HJL=B,U-.A]-"499NB(;B
M5Y)4]VX'Z,3_HW5D5Q<`.-A0;(0)1]#BK0NN=4GP!P"'`4WE06$:79J;1C8,
MKCC5C^0?Q/?+/S`1+0EV"EDD2C^C2#LF3^VMK1N^!:A`>:$!OT>$F2VBZ%QP
M38L1))!9!3ZA*N31O;KQ?"E.T^4A__)@HRN]_V>UT#:\_VLC'314!MS^'V7(
M_VKO_Z'.7O;&G(6@L7X@[3V09:H9H>HJQD%0L!A+#VGKL5%F_DX@L1B\_^=$
M^@/_?T7L_JU*09KMX9Q=EIA)0;PN%0/Y%;@;A1C#XD",@?_G#)3U["M=IAM#
MJU34!XF=EKM)@5C*ZMQ-T:"3^U.I;;SH:D<E?2/C$Q\8=$>]`TP$-&/P9GVZ
M9\5TS1HSP_(VBU=(J&&WZ^NPJF*W@A)]^72:SETZ4/\NG:SS#+-N'?-_V+^%
M-?/_)&V\_Z?=9OA_KDW_(]?W->Q_E`_[WT$:_6\D(QG)2$8RDI&,9"0C&<E(
M1C*2D8QD)",9R4A&,I*1C&0D(QG)2$8RDI&,9"0C&<E(1C*2D8QD)".5I_\'
(HNM`!0!``0``
`
end

Cows On The InterTubes!

Posted by cafebabe on Thursday July 21 2016, @12:41PM (#1981)
1 Comment
Software

Before pictures of cats were popular on the Internet, we had text cows:-

$ fortune | cowsay
 ----------------------------------
| What's the major use of cowhide? |
|                                  |
| Holding cows together.           |
 ----------------------------------
     \
      \   ^__^
       \  (oo)\_______
          (__)\       )\/\
              ||----w |
              ||     ||

And now the popular cowsay utility has been cow-patched to handle multi-line input correctly, especially if it contains UTF-8. Here's the archive with a SHA1 of d3cc231704eb8575941478be3ebbc19fb6b0f5c4:-

begin 644 cowsay-3.03c.tar.gz
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
3!0````````#PDP<PKBE*`!@!````
`
end

And here are some example uses:-

$ cowsay -f frog Hey, man. This lillipad is `df | perl -e 'while(defined($line=<STDIN>)){@field=split(/[ \t\n\r]+/,$line);if((index($ENV{'PWD'},$field[5])==0)&&(length($mount)<length($field[5]))){$mount=$field[5];$avail=$field[4]}}print $avail,"\n"'` full. Ribbit.
 ----------------------------------------------
| Hey, man. This lillipad is 99% full. Ribbit. |
 ----------------------------------------------
     \
      \
          oO)-.                       .-(Oo
         /__  _\                     /_  __\
         \  \(  |     ()~()         |  )/  /
          \__|\ |    (-___-)        | /|__/
          '  '--'    ==`-'==        '--'  '

If you're particularly inclined, you can chain/nest instances of cowsay:-

$ ls -l / | cowsay | cowsay | cowthink
 ----------------------------------------------------------------
(  ------------------------------------------------------------  )
( |  --------------------------------------------------------  | )
( | | total 84                                               | | )
( | | drwxr-xr-x   2 root root  4096 May 10 23:11 bin        | | )
( | | drwxr-xr-x   3 root root 16384 Jan  1  1970 boot       | | )
( | | drwxr-xr-x  12 root root  3240 May 28 11:17 dev        | | )
( | | drwxr-xr-x 111 root root  4096 May 28 23:31 etc        | | )
( | | drwxr-xr-x   3 root root  4096 May 10 22:57 home       | | )
( | | drwxr-xr-x  19 root root  4096 May 10 23:12 lib        | | )
( | | drwx------   2 root root 16384 May 10 23:38 lost+found | | )
( | | drwxr-xr-x   2 root root  4096 May 10 22:52 media      | | )
( | | drwxr-xr-x   2 root root  4096 May 10 22:52 mnt        | | )
( | | drwxr-xr-x   7 root root  4096 May 10 23:30 opt        | | )
( | | dr-xr-xr-x 104 root root     0 Jan  1  1970 proc       | | )
( | | drwx------   5 root root  4096 Jun  1 09:04 root       | | )
( | | drwxr-xr-x  12 root root   320 May 28 11:17 run        | | )
( | | drwxr-xr-x   2 root root  4096 Jun  1 05:17 sbin       | | )
( | | drwxr-xr-x   2 root root  4096 May 10 22:52 srv        | | )
( | | dr-xr-xr-x  12 root root     0 May 28 11:17 sys        | | )
( | | drwxrwxrwt  17 root root  4096 Jun  1 09:53 tmp        | | )
( | | drwxr-xr-x  11 root root  4096 May 10 23:27 usr        | | )
( | | drwxr-xr-x  11 root root  4096 May 28 23:27 var        | | )
( |  --------------------------------------------------------  | )
( |      \                                                     | )
( |       \   ^__^                                             | )
( |        \  (oo)\_______                                     | )
( |           (__)\       )\/\                                 | )
( |               ||----w |                                    | )
( |               ||     ||                                    | )
(  ------------------------------------------------------------  )
(      \                                                         )
(       \   ^__^                                                 )
(        \  (oo)\_______                                         )
(           (__)\       )\/\                                     )
(               ||----w |                                        )
(               ||     ||                                        )
 ----------------------------------------------------------------
     o
      o   ^__^
       o  (oo)\_______
          (__)\       )\/\
              ||----w |
              ||     ||

Setting Date And Time On Unix

Posted by cafebabe on Thursday July 07 2016, @01:18PM (#1950)
4 Comments
Software

One of the cruftier parts of Unix is the obtuse format for setting date and time. However, it is a deficiency which be trivially overcome. Rather than refer to the manual *every time* I set date and time, I wrote this:-

echo
echo 'date and time is believed to be' `date -u`
echo
echo 'specify date and time in UTC in format YYYY-MM-DD HH:MM:SS'
echo
echo -n '? '
perl -e '$line=<STDIN>;print "\n";if($line=~/([0-9]{4,})[ \t]*[.\-\/:]?[ \t]*([0-9]{1,2})[ \t]*[.\-\/:]?[ \t]*([0-9]{1,2})[ \t]*[.\-\/:]?[ \t]*([0-9]{1,2})[ \t]*[.\-\/:]?[ \t]*([0-9]{1,2})[ \t]*[.\-\/:]?[ \t]*([0-9]{1,2})/){system(sprintf("date -u %02i%02i%02i%02i%04i.%02i",$2,$3,$4,$5,$1,$6));print "\n"}else{print "date and time format not valid.\n\n";exit 2}'

This performs a modicum of validation before invoking the date command. date provides further validation and, rarely for a Unix utility, provides feedback.

I had to set Unix time quite frequently when evaluating a Raspberry Pi. Due to the extreme and counter-productive cost-cutting of this design, it has no clock. Superficially, it seems to have a source of montonic time. However, /etc/init.d/fake-hwclock, /etc/fake-hwclock.data and, most notably, /etc/cron.hourly/fake-hwclock indicate that attempt to maintain monotonic time has been bodged. On Debian derivatives, it is typical for an hourly system cronjob to run at 17 minutes past each hour - or, in this case, what a system *thinks* is 17 minutes past each hour. This is because Raspberry Pis which incur unexpected loss of power generally gain the impression that the time is about 17 minutes past an hour shortly after booting.

I've mentioned this to a few people and the reaction is usually revulsion. Even writing the *next* hour would be preferable to the current configuration because this would ensure no slippage, no time loops and no locally ambiguous timestamps. But, no.

Actually, I've just edited the script /sbin/fake-hwclock and changed one line from:-

date -u '+%Y-%m-%d %H:%M:%S' > $FILE

to:-

TZ=UTC-1 date '+%Y-%m-%d %H:%M:%S' > $FILE

C'mon. You've gotta be cringing now. I'm abusing a locale setting because it is the laziest method to specify one hour ahead of the current time.

Thankfully, more accurate time can be sourced from a variety of places. NTP [Network Time Protocol] is the favorite. However, this assumes that a network exists (and that a secure system can be presented to a network). Time can be sourced via I2C but you'll have hard-code the I2C device ID and poke around two parts of the privileged memory map because the wiring changed between revisions. And it would be fair to assume that any solution which covers current variations will fail to work with future revisions.

It is also possible to obtain time via GPS via USB. In some regards, this reduces the task to a previously solved problem.

Anyhow, if you want something portable, memorize and mentally juggle:-

MMDDhhmm[[CC]YY][.ss]

or use a Perl one-liner.

simple-init, simple-network, simple-cron

Posted by cafebabe on Thursday June 02 2016, @10:11PM (#1907)
1 Comment
Software

With the clearance of my venture co-founders, here is the first public release of a Perl init system for Unix. First, the licence:-

THIS SOFTWARE IS PROVIDED AS IS, AS IS, AS IS. OH, THAT'S BETTER. I WAS ABOUT TO SNEEZE. WITH EXCEPTIONS, THIS SOFTWARE IS PROVIDED UNDER COPYRIGHT LICENCE AS A TRACTABLE AND PRACTICAL IMPLEMENTATION OF AN INIT SYSTEM. PLEASE DISTRIBUTE CHANGES SEPARATELY IN UNIFIED DIFF FORMAT. THIS SOFTWARE IS INTENDED FOR EDUCATIONAL PURPOSES AND RE-IMPLEMENTATION IN LISP OR MAKE BUT WILL PROBABLY JUST GET DEPLOYED IN ITS CURRENT FORM. THIS SOFTWARE MAY RUN FASTER/SLOWER OR MORE DETERMINISTICALLY/LESS DETERMINISTICALLY THAN SYSTEMD. USE OF THIS SOFTWARE MAY CAUSE HAIR RE-GROWTH. IN THE CASE THAT HAIR HAS OR HAS NOT BEEN LOST, USE OF THIS SOFTWARE MAY CAUSE HAIRY PALMS AND/OR LYCANTHROPY. USE OF THIS SOFTWARE MAY INHIBIT THE ABILITY TO SHIT RAINBOW-GLITTER UNICORNS. PLEASE CHECK LATEST CLAIMS FROM LENNART POETTERING FOR FURTHER DETAILS. DISTRIBUTION AND RE-DISTIBUTION OF THIS SOFTWARE MAY LEAD TO INEXPLICABLE ALL-CAPS SHOUTING AND/OR SPONTANEOUS EMISSION(S) OF WEASEL-WORD LEGALESE. WARNING: DO NOT USE IN COMBINATION WITH MINOXIDIL.

The distribution includes simple-init, simple-network, simple-cron, an unfinished and incorrect implementation of ls in Perl, a stub implementation of sendmail, some example Unix commands from various sources implemented in Perl and stub implementations of poweroff, halt and reboot.

The Makefile attempts to gather the binaries, libraries and source files required to make a comprehensive chroot environment. This is likely to fail on your system but the manifest should be clear. In the unlikely event that it succeeds, it will require 20MB or more of storage. boot provides a stub implementation to boot and reboot the environment. shell provides a mechanism to chroot into the environment.

The default configuration of this distribution:-

  1. Requires root privileges within a chroot environment.
  2. Is likely to screw your network connection.
  3. Will attempt to tie $ROOT/bin/sh to virtual terminals without login authentication.

All of this may be disabled by changing boot, shell and configuration found in etc/simple.

Further documentation is in the archive which has SHA1 of 3577f214a983519ea5ade23e9591968a9dd2d8b3:-

begin 644 simple-dist-20160531-173839.tar.gz
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
;)WNR)WNR)WNR)WNR)WN^H^?_`"A=4HD`"`(`
`
end

One file in this archive, pom, has a dubious licence. We believe that it was originally written in C under BSD licence. However, it has been ported to Perl, extended with the -e parameter (which is quite nice) and distributed as Perl/Artistic licence. An example of the extended output is as follows:-

$ pom -e
Date : 5/31/2016:16            @@@@@@@-::::::::
Phase: Waning Crescent   @@@@@@@@@@@@*:::::::::::::::
Full : 45%            @@@@@@@@@@@@@@@:::::::::::::::::::
                   @@@@@@@@@@@@@@@@@8::::::::::::::::::::::
                 @@@@@@@@@@@@@@@@@@@O::::::::::::::::::::::::
               @@@@@@@@@@@@@@@@@@@@@=::::::::::::::::::::::::::
              @@@@@@@@@@@@@@@@@@@@@@-:::::::::::::::::::::::::::
             @@@@@@@@@@@@@@@@@@@@@@@:::::::::::::::::::::::::::::
            @@@@@@@@@@@@@@@@@@@@@@@@::::::::::::::::::::::::::::::
            @@@@@@@@@@@@@@@@@@@@@@@@::::::::::::::::::::::::::::::
            @@@@@@@@@@@@@@@@@@@@@@@@::::::::::::::::::::::::::::::
            @@@@@@@@@@@@@@@@@@@@@@@@::::::::::::::::::::::::::::::
            @@@@@@@@@@@@@@@@@@@@@@@@::::::::::::::::::::::::::::::
            @@@@@@@@@@@@@@@@@@@@@@@@::::::::::::::::::::::::::::::
             @@@@@@@@@@@@@@@@@@@@@@@:::::::::::::::::::::::::::::
              @@@@@@@@@@@@@@@@@@@@@@-:::::::::::::::::::::::::::
               @@@@@@@@@@@@@@@@@@@@@=::::::::::::::::::::::::::
                 @@@@@@@@@@@@@@@@@@@O::::::::::::::::::::::::
                   @@@@@@@@@@@@@@@@@8::::::::::::::::::::::
                      @@@@@@@@@@@@@@@:::::::::::::::::::
                         @@@@@@@@@@@@*:::::::::::::::
                               @@@@@@@-::::::::

Invocation of this program tends to be followed by an involuntary look out of the nearest window. This is completely futile because you've got much bigger problems if this program is wrong.

When you're bored of running simple-init and suchlike in a chroot environment, here's an example configuration which is intended for use on Raspbian (with SHA1 of 4279ec51fdcdff89fac2a17fe0c10475fae4449c):-

begin 644 simple-dist-raspbian-201605-current.tar.gz
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
L;OKLWV@0%Z*??]SF_XQR_^WC?Q<43"(!_,.``0,&#!A7&?\#VV&350"@````
`
end

It should be relatively easy to adapt this configuration for other Linux distributions and especially Debian, Mint or Ubuntu. However, there is a very large catch for serious deployment. We haven't written any platform-specific helpers to send shutdown, halt or reboot messages to any kernel. On versions of Raspbian with the Upstart init system, the supplied /sbin/shutdown, /sbin/halt, /sbin/poweroff and /sbin/reboot utilities sorta worked with warnings (and a pregnant 30 second pause because something seems to ignore SIGTERM). However, none of this works with systemd, so good luck with /sbin/reboot -f and suchlike.

If you're suffering systemd on Raspbian, Debian, Mint, Ubuntu or suchlike, please note that this configuration makes references to scripts in /etc/init.d. Some of these now indirectly depend upon /bin/systemctl. Each invocation of /bin/systemctl incurs a pregnant pause due to an attempt to launch dbus. This unwanted behavoir can be minimized by dumping the contents of /etc/dbus-1/system.d.

If you're not bold enough to make a symbolic link from /sbin/init to /usr/sbin/simple-init then other options exist. For example, it is possible to add the following to /etc/rc.local:-

/usr/sbin/simple-init &

If you have SysV init, it is also possible to add similar to /etc/inittab. A similar arrangement was recommended for running daemontools under SysV init. Indeed, if you have the time and patience, you may wish to compare and contrast daemontools and simple-init.

If you don't run simple-init as the main init system then you definitely have to drop most of the configuration. Also note that some of the supplied configuration ties /bin/bash to virtual console screens without login authentication. This deliberately insecure configuration is a proof-of-concept to show that any arbitrary program can be tied to any arbitrary tty using a trivial configuration of simple-init. This is required by our venture. Your requirements probably differ significantly.

If you have a version of Raspbian with a previous version of the ARM Linux kernel then you may require two additional files to maintain /etc/mtab. We're not sure how far back you'd have to go to require the legacy configuration but it is somewhen over the last two years. And of course you'd want to run a legacy version of Raspbian because that avoids running systemd. Anyhow, if your instance of /etc/mtab is not a symbolic link to /proc/mounts and /etc/init.d/mtab.sh is present then you'll very probably want to deploy two additional files (with SHA1 of 6412afcc6c5e6ae4f1e8d22b73d933fdbdf36ce1):-

begin 644 simple-dist-raspbian-201605-legacy.tar.gz
M'XL("(9(35<"`W-I;7!L92UD:7-T+7)A<W!B:6%N+3(P,38P-2UL96=A8WDN
M=&%R`.W6S4Z#0!B%8=9<!<8U97Z_2=Q[(<-/=`P%`M-&[]X!34U,H#6FS6C.
MLZ&!6?7EI)W<?FB;O':3ST<[#:6S72X8)Z;SMGFRU5N1_!8+C-;+-?A^73YS
M88042DH2">.:F$HRG=S`8?)VS+)D['N_=>[<\S]J.M^_\55QX_XDM4'_B/I_
M'"MNU=^09N@?7_]J[+OB^OT%(\[1/]+^+WU97+D_ER31/^+^MO+N>.GOP4_Z
M*QGN"T%2H'_\_1GG^:%NCOG>VW*S/RFUVI^'V%R0,4:0DO/^E='A_S]#_ZN[
MO_M\`USGPAO0M+VMT_3QM:D>LJ7\?']7%Z?*V?Q]^7#"^?43_9"F"?S__3/:
MGOYE^Q=TVK^4<MY_^`G`_F/:_UQY-SVOKO_K.;8/````````````$(-WOZ;@
%I``H````
`
end

This distribution has not been tested with DHCP. To configure a fixed network address, add the following or similar to /etc/rc.local:-

ifconfig eth0 10.55.44.33 netmask 255.255.255.0

or modify and deploy the following configuration which has SHA1 of 08ba5213ce612e2fe426f1d495b0bfc4d9a3eeaf:-

begin 644 simple-dist-raspbian-201605-network.tar.gz
M'XL(")!(35<"`W-I;7!L92UD:7-T+7)A<W!B:6%N+3(P,38P-2UN971W;W)K
M+G1A<@#MUMU.@S`<A^$><Q6]`:`?_$O"V8[T!,^\@,JZ2.9@H55OWV[&Q)AL
MCJD$XN])^&["P0L%W^[V3RY=MSZD@_7[A]9VJ1+2"$H[%U[[89NS'Q)1273<
M1E^WQWVI2J55H4E)=KB[,HP3F\"S#W;@G`U]'\Z-^^[Z0OD+^KO0Y!/W-T*B
M_YSZOX_+I^FOXGB%_C/L?]4G87Q_24:C_XS[MUUPP\8V%\T(8_H;86+_^!B4
MZ+^(_K8)[<OYQV!\?Q("\_^B^KOP*+*F[S8G^INB.-E?QMA2F5+'W[ZXCOT-
M26)<H/^?JV.XBM>KN_ODQ@97<2DRHJPH,IG<]CY\.J%U4EN_K;B*QQ^+2!C\
JY_=_W0\[VX7\M_[_S.'])UD2YG\`````````````@&N]`=V0_CP`*```
`
end

Finally, if you have difficulty with uudecode, the version supplied in PerlPowerTools-1.007 works with these archives.

Nice Concept, Shame About The Hardware And Software

Posted by cafebabe on Thursday June 02 2016, @02:16PM (#1905)
2 Comments
Software

An ex-housemate was a part-time touring musician. He had a normal job but he also toured internationally as a keyboard player in various bands. Obviously, he multiple musical synthesizers with different features and, obviously, some of them suffered rough treatment.

Well, one synthesizer got dropped a fair distance and didn't work well after that event. It sorta worked but it was described to me and a friend as playing multiple notes when only one key was pressed. We immediately suspected what was wrong. Computer keyboards and musical keyboards are usually arranged as a switch matrix. In this arrangement, there is a conceptual rectangular grid of switches (controlled and monitored by a microprocessor). The matrix is sequenced such that the microprocessor powers one row of switches and the status of individual switches can be selectively read. If this grid is approximately square, it minimizes the input and output wires to the microprocessor and therefore reduces the cost of microprocessor's physical packaging.

So, it was very probably a trivial case of crossed wiring. What was the cause? We were told that the synthesizer had landed on an obstruction (a base drum?) squarely in the middle. That's a good clue. A full-size synthesizer is significantly larger than its circuitry but to make the gadget is equally weighted, the complicated parts are usually placed in the middle. But what causes crossed wires rather than total failure? We had a working theory. Electro-magnetic shielding.

Being programmers who don't carry screwdrivers, the musician supply tools. We removed a few screws and found that the (unusual) four row connector had been stamped into a cheap and nasty folded plastic laminated sheet of really thin aluminium. The sheet was pressed against the connector by the cracked, indented case. That was the cause of the crossed wires. Well, we ripped that sheet out and re-assembled the synthesizer with a full set of screws.

It worked first time.

Our musician friend was surprised and confused. If the synthesizer worked without that dull shiny sheet then why was it included? Surely that made it less reliable and increased the cost?

Because, regulations. (Do we have to explain FCC Part 15 to a musician?)

That's ridiculous. It is a synthesizer. It isn't going to make head-in-microwave-oven levels of electro-magnetic radiation under under circumstances. And how does a folded sheet prevent radiation leaking from the edges? It doesn't.

We all learned something from that. Our musician friend probably learned the most but it left him very disconcerted that his trusty synthesizer worked fine by completely removing a factory-fitted component.

This came to mind because I've been evaluating a Raspberry Pi for a commercial venture requiring hardware control. The result of the evaluation is that a Raspberry Pi (or one of the numerous clones) is not suitable for any task requiring hardware control but not for obvious reasons. I'd be extremely uneasy using a Raspberry Pi or equivalent to control the environment of a fish tank. Yes, thousands of people doing this or more critical tasks such controlling blood insulin levels with a Raspberry Pi or an Intel Edison. However, some people have no better choices.

I have no love for the Raspberry Pi. It was initially selected over the clones or other platforms based on a group conversation at my local hackerspace. We performed a back-of-an-envelope calculation to estimate the quantity of unused Raspberry Pis. Our lower-bound estimate was 1.8 million functional but unused Raspberry Pis. How does this come about? Well, geeks get the concept and think "Oh, that's a great gadget! I'll tinker with one when I've got some spare time." That spare time never arrives and another geek gadget sits in a cupboard and gets forgotten.

Indeed, the Raspberry Pi I have on loan was purchased for tinkering and also to teach a specific kid about programming and electronics. After a brief flurry of activity, it was placed in a cupboard and forgotten for two years. I may be able to evaluate a more recent model which is currently resident in someone else's cupboard. This proves that point that there is a vast pool of surplus units. But why is this such a concern?

This is important because it allows potential customers to determine when components become scarce or expensive - independent of our efforts to maintain supply. Indeed, there is a paradox of long-term supply. If care is taken to ensure that customers have long-term supplies from second-sources then sales from the primary source increase and second-sources become less important. Further re-inforcement occurs because long-term supply increases re-sale value and decreases depreciation. In the worst case, if a customer pursues a venture which is nonviable, losses are reduced because capital assets with long-term support return more pennies on the dollar. This in itself make our venture and our customer's venture more viable.

So, there's an argument for ensuring that even the most awkward to obtain component is a commodity. The remainder of the exercise is a trade-off between cost, functionality and estimated future supply.

Exponential Decay

My estimate is that currently available models of Raspberry Pi will be widely available for more than 10 years. Further development and sales may extend that beyond 20 years. How is that estimated? An exponential decay of working units can be calculated from a known starting value. The only other figure which is required is lambda, the rate of decay over time.

Some of these figures are widely known or can be easily computed. For example, invulnerability to a particular virus or network attack is about 22 days. That is, half of the vulnerable computers get patched or retired in 22 days. Half of the remainder get patched or retired in the next 22 days. Half of that remainder get patched and suchlike until the remainder is negligible. Is it really 22 days? Well, desktop computers may be unused when users go on holiday. Servers may be unmaintained. And millions of network-enabled devices have no upgrade path.

Lambda for server application retirement is about 15 months. Just consider stuff that comes and goes on the Internet. Yeah, some of it sticks around. However, I'm aware of a music company and record company which continuously re-write their mission critical software. Feel free to poke holes with the figures but it should be obvious that there is a large gulf between a running server and secure server. It is also foreseeable that a customer may have a mission-critical application and no hardware or secure means to run it.

If you have a large system, this type of attrition is visible as you work. If you have 3000 harddisks, about 10 fail every day. You may do a quick back-check here and think I'm crazy for suggesting MTBF [Mean Time Between Failure] for a Seagate harddisk is about 300 days. I'm don't doubt that you have a desktop computer with one harddisk which gets lightly used for 40 hours per week and lasts more than five years. Put 144 in a rack, run your application at [redacted] throughput and watch them shake each other to pieces. Not too many of those last for five years. And the ones that survive aren't worth running due to advances in technology.

Even you think that a harddisk lasts five years or more, are you sure you're not invoking a bath-tub curve survivor bias? My bad experience of a single unit purchase was, of all times, on behalf of my musician ex-housemate. In addition to lowering my average, it made me look like an unreliable idiot.

Background

I'm a little intimidated by hardware. I understand Boolean logic and I've even made a circuit with an analog integrator and a VCO [Voltage Controlled Oscillator]. However, I'm intimidated by the scale of integration. At a push, I'll perform server hardware maintenance. I've even reset the root password on an SGI Indy. But I won't open a laptop and I certainly wouldn't attempt to repair a cellphone or tablet. These credit card size computers are very definitely in the latter camp. Almost all of the credit card size computers use Micro USB power and Micro SD storage which is interchangeable with phones and tablets. Indeed, many of the cheap tablets have a circuit board which is, erm, about the size of a credit card computer.

I've also had bad experiences with the accompanying software. Most recently, our venture was burned by a Texas Instruments ARM evaluation board. After about US$50 and 12 person hours, we got absolutely nowhere. Not even deployment of the blinking LED example. (Apparently, something might have worked over USB if the development software wasn't installed in a virtual machine. I don't know what facilities it requires from a bare-metal installation but that's *exactly* why it wasn't trusted with such access.)

Some people don't have these concerns. They'll download anything from anywhere and run it on any insecure combination of hardware and operating system. Obviously, it'll fail at inopportune times but that doesn't deter the ignorant from extracting maximum goodwill. For example, here's a short conversation started by someone with far less knowledge and far more bravado:-

[Idiot sidles up to me in hackerspace.]
Idiot: Do you know anything about software? [I'm so glad he didn't say coding.]
Me: Maybe.
Idiot: Do you know anything about for loops?
Me: Yes. Is this for a project?
Idiot: Maybe.
Me: Is this for a paid project?
Idiot: Maybe.
Me: Am I getting any of the proceeds?
Idiot: No.
Me: [Very unamused.] Fuck off.
[Idiot sidles up to the nearest person who was out of earshot and repeats enquiries.]

I don't mind helping students or the intellectually curious but I'm not free tech support for your hipster venture, especially when I've got my own commercial venture. We haven't spoken since but further investigation revealed that the idiot obtained a paying contract to make a robot. He had successful installed development software, copy-pasted example code from the Internet and got servos moving. However, he has no freaking idea how to write software.

In another example, I know an old electro-mechanical engineer who got a Raspberry Pi streaming with XBMC within four weeks. That was starting from a Windows desktop (and while coping with a senile, dying parent). Apparently, if you start from a Windows installation, getting a bootable Micro SD card is one of the hardest steps.

Maybe I'm encountering bias where people are loud about their successes. However, I'm astounded that it took me six weeks to get confident with a Raspberry Pi. By confident, I mean installing the PerlPowerTools (117 Unix utilities written in Perl), a Perl init system, compiling a database from source code with a custom set of compiler flags and then adapting SQL stored procedures. Unfortunately, very little of this has been repeatable.

I started with a two year old version of Raspian [Raspberry Pi Debian Linux]. This was state-of-the-art when placed in a cupboard and I saw no reason for an immediate upgrade, especially if the upgrade included systemd. So, I began with tempered bravado. My first task was to establish a network connection. Given that I started with the Upstart init system, this was achieved removing the Micro SD card, mounting it on my desktop and adding the following to $MOUNT/etc/rc.local:-

ifconfig eth0 10.55.44.33 netmask 255.255.255.0

I set my desktop to an address in the adjacent /27, 10.55.44.65. My next task was to find the username and password for the default account, if any. $MOUNT/etc/passwd indicated that there was an account pi with UID 1000. The password was unknown. The first attempt, password failed but removing the Micro SD card and copying my desktop's password from /etc/shadow was sufficient to bootstrap. (I've subsequently been told that the password pi would have worked. On more recent versions, the default password has been changed to raspberry. Either is highly insecure and should be changed before network deployment.)

The loaned Raspberry Pi required a suitable box to prevent accidental damage. The typical solution is to laser cut or 3D print one of the numerous, freely available designs. I couldn't be bothered with this. It was supplied in a small plastic box and I considered using scissors to punch holes into it for power and network. Instead, I used a surplus plastic box which previously contained hummus. Pro-tip: Punch the holes for network and USB where the lid is easiest to open. For comedy value, name the host according the label on the box. For my installation, /etc/hostname was set to hummus01 and the box has been further labeled:-

HUMMUS01
10.55.44.33
255.255.255.0

As a further riff on this joke: We put the soup into soupercomputing!

Splunking around the legacy 2GB installation, I found two non-JavaScript graphical web browsers, C, C++, Perl, Python, Ruby, Scratch, Squeak and support for a specific type of accelerometer and minimal support for GPIO [General Purpose Input and Output wires]. With one online purchase and some copy-pasta code, it should be possible for a bright and motivated 11 year old to make an interactive application which uses switches and/or an accelerometer. The current 4GB installation adds Java, Mathematica, Minecraft and significantly more out-of-the-box hardware support. This is ideal for its primary purpose of education and the learn curve has been smoothed in many instances. For example, a directory of example Python programs all have the line:-

import pygame

This appears to handle window creation, sprites and input mechanisms. With further hand-waving, the remainder is intended to be a contemporary version of Logo. Ignoring the shovelware, the filing system is incredibly similar to an x86 Debian deriviative - with the exception of /lib/arm-linux-gnueabi or /lib/arm-linux-gnueabihf rather than /lib/i386-linux-gnu or suchlike. However, bootstrap and virtual memory differs significantly. If no storage card is present or readable, the HDMI output is a bi-linear interpolation of a 2*2 grid of red, yellow, green and blue pixels. This looks quite pretty but indicates significant failure - usually PEBKAC [Problem Exists Between Keyboard And Chair] failing to re-insert a card. Further errors are indicated through a table of blink lights which has changed between revisions. So, three blinks on one revision means something completely different on another revision. Doh!

The first 128KB of a suitably formatted storage card is not allocated to a partition but quite obviously contains bootstrap code for the primary BroadCom VideoCore processor. (Although the operating system is centered around ARM processor(s), ARM is the junior partner in the hardware design.) The 128KB block, in a well-known location, provides enough intelligence to read a standard partition table and a FAT32 filing system in primary partition one. This provides more bootstrap for the VideoCore processor and an ARM kernel. Previously, a hard-coded set of bootstrap files allocated 64MB, 96MB or 128MB RAM to the VideoCore (or a skeleton 16MB). Contemporary versions provide "overlays" for hardware and a file to provide Linux kernel parameters. This is very different to primary partition one being formatted in ext3 and (effectively) containing /boot/grub.

The typical swap partition is omitted. I presume this due to a variety of reasons including distribution of the operating system as a raw image requiring dd onto the target storage card. Instead, /etc/init.d/dphys-swapfile (and configuration parameters in /etc/dphys-swapfile) sizes and places the swapfile, /var/swap. Unfortunately, swapfile performance is atrocious. After variously increasing and decreasing a swapfile to work in a limited space, 111 extents in an ext4 filing system incurs little overhead. Unfortunately, storage bandwidth is a very significant limitation.

A single-core Raspberry Pi is broadly comparable to an IBM T40 laptop with 512MB RAM and an Intel Celeron Mobile processor from the year 2006. RAM and network bandwidth is similar. For tight loops, processing power is similar. The Raspberry Pi omits screen and keyboard but is significantly cheaper, smaller, more ruggedized and draws about 1/10 of the energy. However, some of the energy reduction is not due to improved manufacturing techniques but due to a significant reduction in bandwidth from processor to memory and from memory to storage. ARM processors have small, deterministic processor caches. This is of minimal concern when running Perl, Python or Java bytecode but it really grinds when doing intensive tasks, such as compilation. This is especially true if compilation spills into virtual memory.

Many find it laughable that a system with 512MB RAM is described as embedded. However, it has become painfully slow to self-host a contemporary operating system without 1GB RAM per core for multiple cores. Although MySQL Server 5.0.x would compile on a Pentium 90 with 32MB RAM in 4.5 hours, MySQL Server 5.7.x requires at least 815MB RAM - or about 36 hours if you haven't got this headroom. (gcc and clang require slightly less RAM or much more time.) Indeed, FreeBSD doesn't consider ARM to be a primary platform because it would take an estimated four months to compile and test the 19000 supported packages. On amd64, this works within eight hours due to the deployment of 24 core hyper-thread compile farms. However, given that FreeBSD for amd64 has gained ARM and MIPS emulation, and native 64 core ARM servers are imminent, better support from FreeBSD will become the norm.

Returning to difficulty with swap, the BroadCom BCM8255 VideoCore bootstrap SD card interface becomes mmcblk0 and, in particular, get acquainted with the ARM Linux kernel process mmcqd/0 using 100% CPU power when communicating with /var/swap on /dev/mmcblk0p2. A benchmark with iozone found that my installation has about 0.4MB/s of storage bandwidth. If you're accustomed to 20MB/s from an ATA disk, divide that by 40 and round it downward. If you're accustomed to 50MB/s from SATA, try 1% of that transfer rate. In use, this isn't an obvious problem. For example, it is possible develop interpreted scripts in a responsive environment. The problem is that significant backlogs of uncommitted state can accumulate. In scenarios where 300MB RAM is allocated to disk buffers, it may take more than 10 minutes before a system can be safely switched off. I first encountered this after typing sync and finding that it took more than six minutes to complete.

This merely requires patience, understanding and a reliable source of power. However, an alarming complication can be found when viewing logs. The storage cards don't have 100% fidelity and it is possible to see log entries in which writes to specific sectors timeout after 120 seconds! This default should be raised significantly in proportion to RAM and throughput. 1200 seconds may be insufficient for a model with 1GB RAM.

I looked to see if I could increase performance using the mount -o noatime trick. Unfortunately, it had already been applied. /etc/sysctl.d/98-rpi.conf also contains vm.swappiness=1 which, presumably, aids responsiveness.

Some latency may be specific to my installation but there is a strict upper bound on storage communication speed. Despite SD cards and Micro SD cards using a serial protocol, they have eight pins or so. Have you ever wondered about the extra pins? Well, a card and host may negotiate dual, triple or quad channel communication. Unfortunately, the BCM8255 hardware datasheets indicate that SPI for the SD host is decidedly single channel. Furthermore, the clock rate is an even division of the Raspberry Pi's master 750MHz clock - capped at 15MHz due to capacitance of the circuitry. This leads to an upper bound which is less than 2MB/s - and speed steps which are somewhat short of the best case. (14.4MHz, 13.9MHz, 13.4MHz, 12.9MHz, 12.5MHz and so on.) And, obviously, this throughput excludes protocol overhead.

The 0.4MB/s speed limitation is notably absent from a USB2.0 to SD bridge which sustained approximately 9MB/s with the same card. A Raspberry Pi is unable to saturate a 400Mb/s USB2.0 interface and transfer speed remains inferior to sequential ATA access. However, 9MB/s is a significant improvement. Furthermore, if multiple swap partitions or swapfiles are configured, a Linux kernel will allocate virtual memory in proportion to each volume's responsiveness. Unfortunately, default init scripts only permit multiple instances of swap if they are bodged into /etc/rc.local. A further problem is that USB2.0 to SD bridges tend to be cheap units with a short MTBF [Mean Time Between Failure]. This would drag down an already flaky system.

The most significant problem with reliability is power supply. 7W at 5V is 1.4A. This is drawn from a USB power regulator which typically supplies 0.5A or less to a phone or tablet. Indeed, such gadgets are able to sip energy to the extent that a drop a voltage causes momentary disconnect. This allow a regulator's reservoir capacitor to re-charge. However, the VideoCore is a constant power drain. A VideoCore typically forms the brains of a DVD player and this places it in a different league for power consumption. The fourth generation's inclusion of an ARM core, FPU and MMU was speculative and feature matching. A push from techies based in the same city overcame the NDA [Non-Disclosure Agreement] limitations which usually preclude such devices from wider use. In its home market, the chip is sold at cost and then optimized codecs are licenced for fixed production runs. It is quite a departure from usual practice to sell the chip for educational use or general use and then give away two codecs. Old habits die hard and an official codec pack can be purchased by end-users. However, I have yet to find anyone who has deployed an official or unofficial copy.

Returning to power, it would be a reasonable assumption that a device with a Micro USB power connector could be used in conjunction with a Micro USB battery booster. These devices are buck/boost circuits; typically arranged around one, two or four 18650 lithium ion batteries. This battery size is very common in products exported from China and is somewhere between Duracell AA and C batteries. Unfortunately, I discovered that a battery booster is completely unsuitable for use with a Raspberry Pi while demonstrating the Perl init system and the PerlPowerTools at my local Perl User Group.

It booted on the third attempt, which is, unfortunately, normal behavior when cold booting with an empty reservoir capacitor. (Yet another reason why this type of computer is unsuitable for hardware control.) However, the system became unusable within five minutes to the extent that it was not possible to run the Perl version of the du [disk usage] command. Repeated invocations led to the same error because the corrupt sectors were already cached.

Root cause analysis found one byte of corruption when loading a 3KB Perl script (of which less than 2.5KB was active code). However, the system was initially able to load a 4MB kernel and a 1.5MB Perl interpreter without difficulty. I strongly suspect that sustained load causes voltage drop which then causes increased ripple from the external boost circuitry. The Raspberry Pi's regulator and reservoir capacitor cannot smooth the energy to the extent required for reliable operation. Given that the reservoir capacitor is a wet electrolytic capacitor, this effect will become increasingly likely as the capacitor ages, dries and decreases in capacitance.

Analysis reveals that the longevity of Raspberry Pi systems is greatly compromised by the power electronics. Power circuitry is a common cause of failure but it needlessly severe in this design. It is relatively easy to solder additional capacitance in parallel. (Is this a tacit acknowledgement?) This should be considered prior to long-term deployment.

The deal-breaker, which precludes serious usage of a Raspberry Pi (or any of the clones), is the lack of ECC [Error Correction Code] memory. For video decode, a bit error is overwhelmingly likely to cause a momentary glitch on screen before being expunged by the next codec key frame. In other applications, a bit error is much more severe. The lack of error detection or correction is completely unsuitable for long-term unmonitored tasks or, indeed, anything requiring hardware control. I've witnessed corruption which makes software randomly unusable. It isn't just the inability to run a 3KB script. make easily gets snagged during compilation. And it is typical for the process to stop at the same place each time. It is therefore disconcerting that some errors can be averted with a reboot. Unfortunately, there are deeper problems with the directory structure which cannot be averted.

After gaining experience and confidence with a loaned Raspberry Pi, I attempted to make long overdue improvements to signage at my local hackerspace. I'd asked for a password and/or source code. Neither was forthcoming. The most information I received was that the source code was on GitHub. This is marginally more specific than saying it was on the Internet. After several weeks of inaction, I just pulled the storage card and attempted to locate the script. I quickly found the script in one of the 22 home directories. (Oops!) However, iterating changes led to a situation where even the original script failed to run because the interpreter was corrupted after repeated power cycling. A more significant problem was that fsck only makes cursory checks and that fsck.ext4 -f -n found that more than 200 errors had accumulated in the directory structure. Sectors were double allocated to icons and Python scripts.

I'm not stupid enough to foobar that further and I didn't walk away from the problem as if nothing happened. I explained to three or four responsible adults how I'd borked the display. The original system administrator took the opportunity to upgrade and copy accounts across. Unfortunately, this means one more computer has succumbed to systemd. That really sucks because inaction would have been beneficial.

Regardless, a back-check on the loaned Raspberry Pi storage card found that identifiable errors in the directory structure accumulate at the rate of approximately one per day. The working theory is that directory sectors get cached in non-ECC RAM and corrupted over time. Perfectly good data then gets over-written with bad data when the cached directory structure gets modified and written back to storage. This is entirely consistent with observations from large-scale systems. A further complication is that random sectors receive writes due to storage communication errors.

I've yet to cover the main problem with contemporary Linux distributions. PulseAudio, udev, dbus and systemd are written by people who have been brought up using Microsoft Windows and think this type of design is acceptable in a reliable system. (Designs with a lack of source address are a particular bugbear.) They aren't smart enough to be kernel developers and this is combined with an attitude of "Works for me!"/WONTFIX/"I've got mine!" which makes Linus Torvald's famously brusk and forthright style look friendly. Ignoring the second system effect, there's the ADHD behavior of "Ooh! Binary logs! Ooh! DNS! Ooh! Embeded web server! Ooh! QR codes! Ooh! Consoles! Ooh! Bluetooth headset! Ooh! Virtual servers!" combined with an attitude of "It's free!" which completely misses points about code quality or TCO [Total Cost of Ownership].

There's other stuff which looks suspiciously like a re-run of Dual EC DRBG. A single corrupt byte incurs silent journal truncation? Combine that with forced log rotation and it becomes trivial to hide intrusion. Or maybe this gem from /var/log/kern.log generated by the May 2016 distribution of Raspbian:-

random: systemd urandom read with 64 bits of entropy available

WTF? Is there any reason to devise and widely distribute an entropy implementation which is worse than Bruce Schneier's Yarrow or Fortuna? Could something be devised which a least requires at *full* cabinet of equipment in the NSA's virtualized cracking farm? Y'know, the current implementation probably requires a rainbow table of 10TB or less. Could we at least raise the bar to well-funded adversaries only?

If you're a casual user, you may think these concerns are academic. However, as someone who has looked under the hood (and thrown out most of what was found), I assure you that the quality of system components has declined significantly over three of four years. A quick summary is as follows:-

  1. Your system may incur 20 seconds or more of unnecessary boot time. In the 1980s, Steve Jobs regarded one additional second as unacceptable.
  2. Your system will succumb to bit-rot at eight times the rate of older systems.
  3. This assumes you won't get hit by one of the 60 or more unidentified critical security bugs.

I'd like to substantiate each statement.

Boot time with systemd is unnecessarily slow. The primary author of systemd, Lennart Poettering, claims the opposite. This may be true when developing systemd in a virtual machine and the host operating system caches files. However, in real scenarios, this is insultingly false and has been widely debunked. In one case, a server takes more than 10 minutes to perform a memory integrity check before it potentially saves 0.5 seconds with systemd's parallel boot. Wow. Such vast savings. That was entirely worth 260000 lines of source code.

Let's take a more mundane example. The Upstart init system is 120KB. /lib/systemd/systemd is 1106KB and support binaries are almost the same size. /bin/systemctl alone is 498KB. On my loaned Raspberry Pi, the systemd binaries take more than four seconds to read from storage. Furthermore, /lib/systemd/systemd accumulates more than 10 seconds of processing time from the single core processor. That isn't wall-clock time. That excludes kernel processing and storage communication overhead. Overall, it takes about 50 seconds to boot a Raspberry Pi with a default systemd configuration. Out of the 435MB of RAM and 100MB default of virtual memory available to userspace processes, 90MB is already used. Comically, a further 100MB of RAM is initially used to cache files and directories accessed during boot.

Emptying the contents of /etc/dbus-1/system.d reduces program overhead from 90MB to 60MB. Replacing /sbin/init with something sane further reduces overhead to 30MB. Saving 60MB is very significant in a system with 435MB. It also reduces boot time by 20 seconds.

Extraneous code, which is multiple times the size of its predecessor, has to be retained with almost complete fidelity. However, it has already been established that directory structure bit-rot occurs at the rate of one sector per day and this excludes bit-rot to files due to random writes and other causes. Reducing the total number of sectors involved in the boot process reduces susceptibility to inevitable boot failure. Empirically, it is possible to reduce dependencies by a factor of eight. This is the difference between having a system which works for three months or two years.

Then there's the whole thing with LOC [Lines Of Code].

Programmers write programs. Sometimes, those programs work. Very often, programs have bugs. In aggregate, a bunch of competent programmers will write a fairly fixed proportion of lines with bugs. Oddly, this is around one bug per 50 lines of program - regardless of the programming language used. A proportion of these bugs are serious and a smaller proportion are security flaws.

Let's take some examples which are close to hand. Our start-up recently wrote a program to transform files. It has about 50 lines of active code - and two known bugs. That code doesn't even have any loops! The Perl init system has about 400 lines of active code - with five known bugs and more suspected. Overall, this fits the observation of having approximately one bug per 50 lines.

Edsger Dijkstra (or Donald Knuth or maybe someone else) noted that testing can only confirm the presence of bugs. It has also been noted that software wears in rather than wears out. So, would you rather run software which was written last week by an obnoxious kid or would you rather run software which has been run on five million computers for 10 years? The latter reduces problems by at least a factor of 10. Although, the remainder can surprise. As examples, a critical Microsoft Windows bug was found after 15 years and a severe GNU bug was found after 18 years. Some of the innocuous but more numerous bugs may hang around for more than 25 years before being fixed.

However, Lennart Poettering and Kay Sievers collectively write more than 300000 lines of code - code which crashes kernels, leaves computers permanently borked and hogs RAM and processing power with no discernible benefit - and the attitude is that bugs - and even workarounds - are someone else's problem. Submit patches, we're told. I'm not even sure that patches would be accepted because that would be an admission of error in addition to being software which was NIH [Not Invented Here].

There is a strong argument to write code in a high-level language unless strictly necessary. Separate to making a project tractable, it reduces the quantity of bugs and the quantity of severe bugs which become apparent after deployment. There's no magic here. This was known in the 1970s. There's also a strong argument to fix bugs in specification and design rather than code. That's the reason why a productive programmer at NASA writes four lines of code per year and the result is more reliable than a military spec airframe.

Anyhow, I mentioned the Perl init system to a Lisp programmer and this immediately caught his attention. Indeed, he's taken it as a challenge to write something smaller. We're like a two-handed sketch version of a well known cartoon about software ostensibly being written in Lisp but actually hacked in Perl. However, the long-term solution may be neither C, Lisp nor Perl. It is, however, entirely compatible with the GNU philosophy and the BSD philosophy. /sbin/init could invoke make in a directory where the default rule is to perform all of the boot tasks. Even if it was a heinous recursive script, it would be unlikely to attain 1% of the size or complexity of systemd. The limitation is that make would require an extension to catch and handle the POSIX signals SIGCHLD and SIGTERM. However, if this could simplify (or unify) SysV init, daemontools, Upstart, systemd and numerous other systems in a few lines of code then it would be worth pursuing.

One of the many outright lies propagated about systemd was that it would aid portability. No, it hasn't. Indeed, if this was the intention, it could have been achieved with another iteration of the LSB [Linux Standard Base], zero lines of code and zero bugs.

I'll finish with an exchange with another programmer who is now quite bored with init stuff:-

Geek: You can have a cookie if you promise to stop doing strange things with init systems.
Me: You know I can't promise that.
Geek: [Laughs and gives me a cookie anyhow.]

Epilog

While repeatedly trashing a loaned Raspberry Pi installation and another installation at my local hackerspace, the problems encountered with virtual machines, systemd and Windows have led to very real consequences for end-users. I wasn't to blame but this is illustrative of the type of scenario we wish to avoid when deploying infrastructure.

Over the last 30 days, my local hackerspace's laser cutter has been out of action for more than four days solely due to problems with virtual machines, systemd and Windows.

After a fairly serious hardware hacking injury requiring two rounds of surgery and the possibility of amputating a finger, idle chatter about authenticating access to machinery was hastily implemented. I assumed that it was cobbled together with minimum effort while avoiding any really obvious future limitations. However, this assumption was wrong. Root cause analysis has found the exact opposite scenario. It has been cobbled together using as many industry standard components as possible for the purpose of resumé padding.

I thought access to machinery used an ad hoc protocol to a fixed network address. No. It used DNS [Domain Name System], DHCP [Dynamic Host Configuration Protocol] and LDAP [the Lightweight Directory Access Protocol] which all run in separate virtual machines. I have misgivings about using DHCP in such a small environment but we'll let it slide because it allows volunteers to apply industry standard practice. Furthermore, the infrastructure is maintained and security fixes are applied. Unfortunately, due to resumé stuffing, any new whiz-bang feature is also being applied. That includes systemd.

This is where the first incident started. A monitoring system missed 1-3 pings at five minute intervals. This occurred daily within a three hour window during a quiet period. The initial assumption was that yet another anti-social asshole had found yet another method of being anti-social by cold rebooting important servers without warning but only when it was quiet. This led to a small amount of needless recrimination before discussion with local independent retailers found they were similarly affected. So, we were all being affected by a daily electrical brown-out.

With a straightforward init system, servers handled this scenario in a predictable manner. However, systemd execution order is not straightforward. This leads a combinatorial explosion of states between the virtual hosts. This leads to scenarios in which a particular dip and duration in energy is sufficient to leave LDAP non-functional. Two people wasted six hours each waiting in vain for the laser cutter to become operational and similar amount of time has been wasted on a workaround. Specifically, a UPS [Un-interruptible Power Supply]. I'm wholy unimpressed because it goes completely against the adage "Never fix a hardware problem in software. Never fix a software problem in hardware." But there we are. Deficiencies in systemd are being rectified with money from hackerspace donations.

Since then, a separate software incident left the laser cutter inoperative. The computer with the laser cutter CAM software upgraded to Microsoft Windows 10 for reasons which may never be determined. Unfortunately, the application is incompatible with Microsoft Windows 10 and therefore the laser cutter stopped working for the second time within a month. Fixing Windows was cheaper and easier than fixing systemd. And during this period there has been no fault with the hardware. Downtime has been entirely due to flaky software.

So, here's some things in my local hackerspace listed in decreasing order of reliability:-

  1. A Chinese hobbyist laser cutter.
  2. Microsoft Windows.
  3. systemd.

That's messed up - and I'm being really polite about the situation.