Well, of course already back then this was a lie. But, this week it became clear that how far we have come. No one is to leave their home, no one is allowed to get within 1.5 meter of each other. Last week-end, some would not listen and as the weather was nice, the beaches were full. This was not to be allowed, so no you will be fined if they see you in a group. And, zero protest. Today the last active KLM boeing 747 landed at Schiphol. People who went to see it land where fined2. But that's OK as they were warned. The news is full of heroes of the people3. It looks exactly what we were taught about so many years ago.
O, and let's not talk how we halved the number of beds in hospitals in the past 40 years. Well, we will see what the future brings.
At a previous job I made the asked for product but also 2 Integrated Development Environments out of parts laying around. Including a parser framework, a web based UI, a structural editor, an automatic test executor. When the first one became functioning for a while and my production level improved because of it, I decided it needed a rewrite. I was doing my required job and to the outer world productive (and I seemed to be sought out for what I did) but, I could have spent all that time to pull myself out of software engineering.
This past year, I've tried to get better. Not better as in improving myself, but get better as recovering from an illness. So, no engineering, but figuring out what we need to do and then deciding how to do it and making sure someone does it. Plus, communicate to all involved, committing to goals, setting goals. In short "management". I've loved it and this and will continue, but I still have engineering sickness. I wanted to make a package to make box diagrams. I did not communicate in the logs or at work, when the outcome would be too much unknown. I started to learn 2 programming languages; Lisp and Erlang. All off these, flight into save and known activities. Relapses into engineering.
So more convalescent therapy this year.
Some casual observations. The whole country is low maintenance, as in they will not do any maintenance1. It's so visible that you can guess the age of any building or road by the state it is in. For example, looking at the new pathways at the park in Kiev; "This looks so good, only minimal damage, must be about a year old". Indeed, at the gate / walk in point of the park a plate with some text and "2018". Another instance, we walked over a nice piece of green in between two driving lanes in one city. These pieces were rebuilt in different ages. The most recent already had grass growing between the tiles and some minor breakage. As we walked along, the breakage, grass and all around state went down. It was something to see. Now that I'm back, I've also started to notice lack of maintenance here, so what now?
As for restaurants. They provide many, the current hype seems to be sushi2. As with any hype, plenty of pizza restaurants also providing sushi. We did not try, I wanted to try the local food. Which was harder to get then "foreign" shit. Another observation; Queues at the McD, apparently this is a luxury item.
We went to Lviv for a couple of days. This city is way different from the other cities I've seen so far in Ukraine. The whole city has a feel of an Italian city about 25 years ago. Traffic is a mess. Buildings need to be renovated (and some are). A lot of tourists3. We asked at the Hotel, where can we eat some good vareniki? we were directed to the worst restaurant on whole trip. You would start to hate the local cuisine based on this restaurant alone4.
Next we went to the Carpathians, we went by train to Mykulychyn5.
The hotel was next to a mountain spring. The water from the faucet was directly from this spring. Can you image the great taste? The food in the hotel was homemade, in the end we spent more on the food than the stay in this hotel.
After a week of swimming and hiking we went to Kiev to catch our plane. Here we had made a mistake of taking the sleep train back to Kiev. As we got no sleep and the whole experience was overall terrible. The two days in Kiev were nice, this city is simply on another scale.
Me: That must be school
Wife (from ukr): What?, no! it's too big for this area.
Me: It must be.
Wife (to cab driver): What's that building?
TD: School
Advise to future travellers, never book a flight with a transfer in Munich. The Airport seems to consist of about 3 different sub-airports. You'll land at the furthest end of one of the sub-airports and then have to transport yourself to the furthest other sub-airport. This is over these moving bands / flat escalators plus also a shuttle. Note that your transfer will include an extra baggage check, in which they will merrily do an extra swap for bomb residuals on the children. And, of course we need to go through customs, these Germans have 2 boots out of 20 or so open just to produce nice queue. We try to go through the automated machine, this only works for the adults. I ask the customs officer if we can skip the line, turns out it's OK to just push your children through the automated machine at the same time you are going through it. So, some extra running and shuttles later we arrive just on time as the next flight is delayed. And an uneventual 2 hours later we find ourselfs here;
By the time we were ready to go through customs, the queue had dissolved and all went very smooth. As you can see the walkways to the planes have advertisements these days and the in Kiev looks a lot worse than the one in Schiphol. This turns out to be true for the whole country, but that will be another post. That post will most probably be how these people have money to build something but then immediately forget about it and let it rot. To finish up; the food is good.
]]>Currently I'm stuck on this reversing the original logs from the output at btcbase.org because of two problems;
1. The new format using block quotes [link][text] sometimes produces links that are ambiguous and cannot be distinguished from the old way (for example [link][link] or [absolute btcbase link][text] vs [relative btcbase link][text]).
2. Sometime the conversion to html went wrong, for example in http://btcbase.org/log/2016-12-29#1592569. I could make some exceptions for these.
3. It seems that the btcbase.org html output code puts special tokens at the end into the description of the link; i.e. (comma's and dots and closing brackets etc are all eaten and put in the description of the link).
Here are my scripts, to preserve the current status;
The scraper: http://ave1.org/tarpit/log/scrape_log.py
To do all: http://ave1.org/tarpit/log/scrape_all.py
]]>Common Lisp is intended to meet these goals:
The goals of Common Lisp are thus very close to those of Standard Lisp [31] and Portable Standard Lisp [51]2829. Common Lisp differs from Standard Lisp primarily in incorporating more features, including a richer and more complicated set of data types and more complex control structures30.
This book is intended to be a language specification rather than an implementation specification31 (although implementation notes are scattered throughout the text32 ). It defines a set33 of standard language concepts and constructs that may be used for communication of data structures and algorithms in the Common Lisp dialect34. This set of concepts and constructs is sometimes referred to as the ``core Common Lisp language'' because it contains conceptually necessary or important features35. It is not necessarily implementationally36 minimal37. While many features could be defined in terms of others by writing Lisp code, and indeed may be implemented that way, it was felt that these features should be conceptually primitive so that there might be agreement among all users as to their usage38. (For example, bignums and rational numbers could be implemented as Lisp code given operations on fixnums. However, it is important to the conceptual integrity of the language that they be regarded by the user as primitive, and they are useful enough to warrant a standard definition39.)
For the most part, this book defines a programming language, not a programming environment. A few interfaces are defined for invoking such standard programming tools as a compiler, an editor, a program trace facility, and a debugger, but very little is said about their nature or operation. It is expected that one or more extensive programming environments will be built using Common Lisp as a foundation, and will be documented separately40.
There are now many implementations of Common Lisp, some programmed by research groups in universities41 and some by companies that sell them commercially42, and a number of useful programming environments have indeed grown up around these implementations43. What is more, all the goals stated above have been achieved, most notably that of portability44. Moving large bodies of Lisp code from one computer to another is now routine45.
Shall I put in another link to the MP article?
For years, I have wanted to break free of the tools of the Inca; Python, Matlab, Octave. These go-to languages to quickly and easily make something sort of work. I'm now working in a position where another set of tools is used, Word, Outlook, Excel. These are a step worse. Each time, I trade short term gains for long term costs. And those costs are mounting. This cannot stand. So, I want to work towards some sort of solid ground (learn Ada, pin down gnat, read ffa). And also, use Common Lisp for those cases where I would normally go for Python and friends.
Next part of the why, I want to make diagrams like so. I've found no tools to help me with this on the long term;
(defun strcat (a b) (concatenate 'string a b)) (defun spacedstrcat (a b) (concatenate 'string a " " b)) (defun strlistcat (list)(reduce (lambda (a b) (concatenate 'string a b)) alist)) (defun xmlresttag (tag content) (if (and content (> (length content) 0)) (strcat content (strcat (strcat "</" tag) ">")) "/>")) (defun xmlbegintag (tag) (strcat "<" tag)) (defun xmlattribute (attribute) ) (defun xmlattibutes (attributes &key id class) (strlistcat (map xmlattribute attributes)) (defun xmlelement (tag content attributes &key id class) (spacedstrcat(spacedstrcat (begintag tag) (xmlattributes attributes :id id :class class)) (xmlresttag (tag content)))) (defun rectangle (x y width height &key (content "") id class) ()) (defun assert-equals (a b) (if (string= a b) () (progn (pprint `("not equals" ,a ,b) ) (cerror "assertion failed" "abort")))) (defun test$strcat () (assert-equals (strcat "a" "b") "ab") (assert-equals (strcat "this" " is a test") "this is a test")) (defun test$spacedstrcat () (assert-equals (spacedstrcat "a" "b") "a b") (assert-equals (spacedstrcat "this" "is a test") "this is a test")) (defun test$xmlresttag () (assert-equals (xmlresttag "first" "") "/>") (assert-equals (xmlresttag "second" NIL) "/>") (assert-equals (xmlresttag "hello" "world") "world</hello>")) (defun test$xmlbegintag () (assert-equals (xmlbegintag "first") "<first")) (defun run-tests () (test$strcat) (test$spacedstrcat) (test$xmlresttag) (test$xmlbegintag))
The whole artifact is resting on the weak shoulders of concatenate and the wrong concept of merging pieces of text into bigger pieces of text. I am thinking that constructing lists of strings will be a big improvement and then have a function whereby the whole list is output as svg text.
(concatenate 'string "no" "not" "a fixed" "list," "fuck" "it")
But this;
(somefunction alist)
Where alist is;
(list "yes" "just" "a" "list")
The answers I found so far are;
(apply #'concatenate 'string list)
But is this really the way to go? or should I make something based on reduce?
Like this;
(reduce (lambda (a b) (concatenate 'string a b)) (list "why" "no" "sharp-quote" "for" "the" "lambda?"))
Returns t if object is the empty list; otherwise, returns nil.
Luckily, in Common LISP the "empty list" and "nil" are one and the same, so this sentence can be written as is1.
And the examples;
(null '()) => T (null nil) => T (null t) => NIL (null 1) => NIL
Also fine, the four cases you would expect here.
But then, the last line of the notes;
(null object) == (typep object 'null) == (eq object '())
Now, how does help? the author could not be bothered to add some text here? Is "==" somehow part of the syntax?
Or this; Returns t if object is the empty list; otherwise, returns the empty list.
I seem to also getting infected with this LISP virus to look for the edge cases
progn form* => result*
Arguments and Values:
forms---an implicit progn.
results---the values of the forms.
As this will turn out to be important later, I checked the meaning of the asterisk symbol. This is not to be found in the spec as far as I can see, but the author does refer to an((yes the documentation says an, but which one?)) extended BNF, and although the meaning of "extended" is apparently free to interpretation, the asterisk probably stands for 0 or more4. So, conclusion zero or more forms in, zero or more results out.
Next the description:
Description:
progn evaluates forms, in the order in which they are given.
The values of each form but the last are discarded.
The first line parses, the second seem to be in direct contradiction to the "Arguments and Values". Which is it? all the values of all the forms or only the last one? Maybe the examples will make this clear, but first another descriptive line:
If progn appears as a top level form, then all forms within that progn are considered by the compiler to be top level forms.
More links, these have to wait, but this does not parse as is, so if it is a "bottom level form" then all forms are considered "bottom level", or also mid level? or what? What does this mean and how does this sentence clarify?
On to the examples;
(progn) => NIL (progn 1 2 3) => 3 (progn (values 1 2 3)) => 1, 2, 3 (setq a 1) => 1 (if a (progn (setq a nil) 'here) (progn (setq a t) 'there)) => HERE a => NIL
First line, a special case, not described or obvious5, but at least now we know that zero forms will result in NIL. Second, confirms to the description. Third, does this help? a single form will result in the result of that single form. Fourth line and fifth, here we go again, completely over the top side issues added, or does this have to do with the "top level" thing? and then how would this be different in a function definition?
Finally;
Notes:
Many places in Common Lisp involve syntax that uses implicit progns. That is, part of their syntax allows many forms to be written that are to be evaluated sequentially, discarding the results of all forms but the last and returning the results of the last form. Such places include, but are not limited to, the following: the body of a lambda expression; the bodies of various control and conditional forms (e.g., case, catch, progn, and when).
This was how I got to the progn, the if ((special operator, operator, form, function, macro or whatever)) does not support the "implicit progn". This is not how you specify a language! So we have here this syntax, sometimes it is used, sometimes it is not used, here is some of the sometimes it is used. So let say you have 10 people in the spec commission, responsible for writing it. You divide all functions, forms and whatnot between those 10, each has to then do about 100 or whatever. For each you list the implicits and not-implicits or not applicables. You get 3 tables6. You put them in. Done. O wait, you think this "implicit progns" links points to this?