« first day (1499 days earlier)      last day (1145 days later) » 

12:00 AM
@ngn so once I get writing to files working, then exporting function definitions to file is trivial
 
ngn
@nathanrogers yeah
@nathanrogers this?
 
so does "file.txt" 0: "sometext" only work if the file in question already exists?
doesn't work
no wait, yes it did
 
ngn
@nathanrogers it should create it if it doesn't exist
 
its default is to append? or overwrite?
how do I specify the difference?
just a call to \rm "filename" ?
before writing again?
 
ngn
@nathanrogers it only overwrites, but i can change that
 
12:05 AM
so just a call to \echo "newtext" >> filename
 
ngn
what should the syntax look like to be in the spirit of k's minimalism? <- that's a hard question
@nathanrogers that would work, but of course it would be slower (if you do it many times)
 
are sys commands callable from functions?
or only in the repl
 
ngn
@nathanrogers ."\\cmd"
 
@ngn maybe just another integer symbol?
00 for append write?
or 2 or 3 or whatever else isn't used
 
ngn
@nathanrogers possible but so far the integer has been used to specify the format 0: lines, 1: bytes
 
12:08 AM
0: overwrite lines
2: append lines
or 00: appendlines
unless its read as an integer and not a symbol
 
Sounds like time to introduce bitmasks
 
mega oof
 
ngn
generally, i try to be compatible with older versions of k, so if k4 (for instance) has a way to do it, i think it would be better to do the same
 
sure, if there's an established way
 
ngn
@nathanrogers apart from lack of append, any major criticisms for what you've seen so far?
(and lack of docs, of course)
 
12:14 AM
just the \h <word> returning the unit tests for <word>, and possibly putting somewhere in the \h page a definition of x/a/b/k are. n is inferrable enough, but would harm saying n number type
but perhaps the unit tests will illuminate some of those
sockets?
 
ngn
people usually guess those quickly
 
I see you've imported sockets
x is any, a is array? b is boolean?
i have no idea what p is
 
ngn
@nathanrogers i have support for client sockets similar to open(): fd:<`:host:port (quoting from memory)
@nathanrogers in what context?
 
ngn
@nathanrogers `p as a whole is a symbol, you type it as-is
s is a string
`p@s is "parse"
 
12:18 AM
I see
i don't see ` mentioned in \h
 
ngn
@nathanrogers it's a basic data type, like int (0) or char ("c")
 
`symbol creates a symbol?
 
ngn
creates or is
there are list literals for symbols too
 
`x denotes a symbol named x?
 
ngn
yes
`the`list`literals`look`like`this (no spaces between them)
 
12:21 AM
is there a way to bind symbols to something?
 
ngn
@nathanrogers assign to a variable?
a:0 1 2
 
so if I wanted to pass a function I could do f `g rather than f[g] ?
if g is a symbol that is assigned a function?
or I could do an eval like .`g ?
 
ngn
@nathanrogers those are not the same. symbols are first class. all arguments are evaluated before the call, so in the first case f will get `g as argument and in the second case whatever the value behind the variable g is.
@nathanrogers yes!
i wonder how you guessed
 
.`g arglist
is that a proper form?
 
ngn
@nathanrogers i don't think so. it would parse like .`g@arglist which is meaningless
 
12:25 AM
hrm
What are some use cases for symbols in K, if I can just pass function literals
 
ngn
@nathanrogers i think most often they are used as keys in dicts
 
I do remember that
 
they're basically scalar strings afaik
 
ngn
they also happen to be nice representations for "ticker symbols" like `GOOG`AAPL.. in trading systems
 
do you have table representation like I'm familiar with in Q?
ok doesn't mention it
 
ngn
12:28 AM
@nathanrogers tables (in both q and k) are just flipped dicts
but i'm afraid i must get some sleep now
@nathanrogers if you're interested, can we continue tomorrow or another time?
 
ok
tym
 
ngn
cool. see you
 
`a!1 doesn't return anything (from OK manual)
 
1:02 AM
anyone heard about jq?
 
@nathanrogers Yes (in the sense that I heard about it but didn't try using it), though it doesn't look like an array language
 
is it not?
 
why is lack of scalar extension a precondition for array languages?
Correct me if I'm wrong, but I believe it has said that scalar extension was a design mistake in the past?
 
Jan 15 at 9:32, by Adám
@rak1507 Everyone (I think) agree that (,1) + 2 3 4 was a mistake. No, he knows his terminology. He thinks scalar extension was a mistake.
 
1:12 AM
rght
 
"scalar extension was a mistake" was not by Adám though
Singleton extension is a mistake
 
who was saying it then?
I don't see it
 
Jan 15 at 1:32, by Adám
Anecdote: I got a big surprise when an APL old-timer (and still APL enthusiast) today posed that allowing 1 + 2 3 4 was a design mistake
"an APL old-timer", no idea who they are
 
ah
I think the scalar/strand notation leads to a lot of confusion and the notation obfuscates behavior too much
(3⍴1)+⍳3 I don't see why explicitly matching shapes is such a bad thing, aside from golfing
 
I guess the problem here is that we don't have a good definition of what an array language is
 
1:18 AM
You have to explicitly match shapes most of the time anyway
 
Well, the history has gone the opposite, to become even more permissive in the allowed shapes
 
I don't think my definition will hold much water in this community, but my definition is basically:
A language that provides a literal notation for interaction with array, defining operators/functions that treat arrays as primitives
In any bog standard language, 90% of what you're writing that isn't IO is transforming some kind of collection. So the fact that there aren't "primitives" to define such operations is mind-boggling
Most languages provide some kind of array-oriented library, but the code obfuscates the clarity of procedures applied to the data
iota(0,n)
| 1 + 2 × arg
| chunk(2, arg)
| each(1.0 / product(arg))
| reduce(sum, arg) * 8
that's basically all its doing, but its obfuscated by all the "code"
 
@nathanrogers It's usually a lot nicer in languages that are commonly used for data science (I think NumPy does scalar extension and stuff like that)
 
right, but its still in the form of "code"
 
APL code is also code though
 
1:25 AM
^
 
lib.fn(arraymethod(myarray)))
@Bubbler If you're writing tradfns
 
With some nicer operator overloading, I'm sure the C++ code would look less obfuscated.
 
Right, an operator overloading library for an array literal notation would be a possibility
but that isn't possibly in most mainstream languages
 
@nathanrogers You can often import fn from lib and then do something like myarray |> arraymethod |> fn
 
@user right but as a pythonista, that isn't "pythonic"
 
1:26 AM
@nathanrogers Unfortunately not in Java, but C++ and Python do have operator overloading
 
for a number of reasons. 1 import x from y imports all of y, and only names x in the namespace. For another thing, when refactoring, it is now no longer sufficient to simply search for the library referenced in the code
 
@nathanrogers That first part applies mostly to Python, but I'm not sure what you mean by the second part
 
I can't recall the talk, but one of the language implementors gave both of those disclaimers when using import from. One is the name clobbering, the second is that i makes refactoring code simpler because you can find explicit references to lib in your code because you're naming it explicitly
everywhere I have used python as my day job, that has been sufficient reason for rejecting a PR
similar to the "using" keyword in CPP
you don't using std; you say std::cout
or just don't use std :P
 
Oh, I see what you mean
 
just like the code snippet image I sent a moment ago
rw:: hs:: its considered bad in most languages to import libraries or modules in that fashion, mostly for name clobbering, but also because it makes explicit which library each function is imported rom
 
1:34 AM
I've seen some Java APIs that use foo.libFn(method(array)) for everything, which kinda solves the problem of doing lib.fn but can be painful to work with sometimes
Scala lets you rename imports, so you can do import com.bar.{longname => ln}, ameliorating that somewhat.
 
I'm getting the same feedback with Common Lisps asdf
don't specify :using in your modules
 
Not a problem for me - I don't use Lisp :P
 
this sort of feedback seems pretty universal accross paradigms, languages and communities
 
Side note: does APL have "operator overloading" (or perhaps I should say function overloading) for user-defined classes?
 
Amusingly I've been trying to figure out whether BQN should have some sort of using facility. It's definitely bad to rely on it too much but I'm not really sure it should be impossible.
 
1:37 AM
@Marshall In my opinion, it's better to allow it and leave it up to the programmer (as long as you also leave a warning about ab-using it)
 
@user Yeah, I think so. It would also be impossible to sneak it into a particular scope, since •using (?) would have to appear in that scope to affect it.
or a likely rename •eval is similar, assuming it even retains the ability to affect the scope that uses it.
 
maybe use •eval as a name for a "safe" version of eval
 
@Razetime If you want to contain it {•eval𝕩} does the trick.
 
@Marshall Scala 3 has a thing called exports that don't automatically leak into the scope that uses it, but they can shorten paths from foo.bar.xyz to foo.xyz.
 
I don't think it should be a primitive since BQN primitives are simply defined and never have side effects.
 
1:44 AM
I agree with that idea
 
@user That sounds the same as ⟨xyz, etc⟩ ⇐ bar when defining foo in BQN.
 
@Marshall Oh nice, I didn't know BQN had such a feature (although I don't know anything about BQN, really)
 
@user It's namespace destructuring, but using the export arrow instead of the normal assignment one.
I really need to write some namespace documentation.
Actually I should probably do that now. It can't be more than a page or two.
Like it's pretty much exactly exports but you can assign the result of the block to a value and destructure it later, or use ns.member to get one of the fields.
 
(sorry, I can't link to my own message for some reason) The above expression is the list of steps in list order
1. range of ints from 0 to n
2. translate to odd numbers
3. chunk odd numbers into groups of 2
4. get the recriprocal of the product of each
5. 8 times the sum of the reciprocals
or if you just say it in english, 8 times the sum of reciprocal of products of 2 chunks of odd numbers
on reads like a spastic 4 year old coming home from kindergarten "AND THEN AND THEN AND THEN" the other reads like articulate prose
 
@nathanrogers There's no button to reply to yourself: you have to get the permalink and use the number at the end (with a colon in front).
 
1:57 AM
{8× +/ 1÷ ×/¨ (⍵⍴1 0) ⊂ ¯1+ 2× ⍳⍵}100000
 
 
1 hour later…
3:22 AM
 
 
1 hour later…
4:37 AM
@user Marshall was working on something like that at Dyalog. Not sure what happened to the project when he left. I can inquire, if you want me to.
 
4:56 AM
@Marshall +←1
 
5:08 AM
Function overloading for classes could enable designing a DSL using APL symbols (which may or may not be a good thing)
and I do see some complications, e.g. what to do with (array of class objects)+(another array of class objects) or similar
 
5:25 AM
how exactly
is 1 =≢ 0
 
≢Y is defined as ⊃1,⍨⍴
 
0... is a scalar
@Adám why
there is no count of a scalar
 
True, but I guess it seemed a more useful result than… an error?
 
⋄{⊃(⍴⍴⍵)/1,⍨⍴⍵}4 4⍴⍳100
⋄{⊃(⍴⍴⍵)/1,⍨⍴⍵}0
i don't know how the eval thing works
 
Apparently bot is offline (which means the IRC bridge is also off)
 
5:29 AM
For one, it requires the bot to be here.
 
no error
 
@Moonchild Halp, the bot is dead.
Other ways to think of are {⊃⍴1/⍵} and {⊃⍴⍪⍵}
 
all of which
are changing the type of a scalar
 
⊃(⍴⍴⍵)/ just makes the result zero for scalar, because on an empty numeric array is 0
 
right
because there is no count to a scalar
 
5:33 AM
It's simply not well defined (because is the length of the leading axis but a scalar has no axes)
 
right
so the length is 0
 
so what to return is just a choice by the implementation (Dyalog chose 1)
You are free to choose what you want if you build your own APL
 
0 0 0 0 0⍴⍳123123
guess what the count of that is
 
Of course it is zero, since the leading axis has length zero
 
the count of anything with no axis is 0
 
5:35 AM
No, it has five axes
 
it doesn't
its a prototype
 
I mean 0 0 0 0 0⍴⍳123123
 
its not a thing with 5 axes of length 0, its a prototype of a thing with 5 axes that doesn't exist until it has a length along one of the axes
so it has no axes
because it doesn't exist
if you define a bucket that has no contents, the bucket isn't contents
its a bucket
it holds stuff
there are no contents to have dimension
so you can't measure the dimensions
of nothing
just like
you can't measure the dimensions
of 0
 
Multi-dimensional empty arrays are a thing in APL.
You can create an array of shape 0 1 and horizontally concatenate with another array of shape 0 1 to get an array of shape 0 2
 
@Bubbler I'm saying cherry picking which concepts are "pyoor mathumatix" is arbitrary
@Bubbler you know what the count of that is?
0
 
5:43 AM
Even though all of these arrays have zero elements, the shape and the operations are mathematically well defined
 
except for ≢0
apparently
 
That's an exception, but it's no different from ÷0
Where something is mathematically well defined, you follow it. Where it isn't, the implementation can choose what to do.
Also the same for taking the first element from an empty array (which is the reason ≢0 is not well defined)
 
@Bubbler seems pretty well defined in terms of ⍴
I mean ⍬ makes more sense than 1
but ⍬ is a list
not a count
 
Then it doesn't make much sense either, since the result of is supposed to be an integer scalar
 
The individual things in a domain being counted do not and cannot themselves have a count
 
5:51 AM
But in APL, everything is an array, including a scalar value
 
@Adám ^ ehem
 
@nathanrogers I think you're confusing ≢Y and ×/⍴Y
@nathanrogers What? That's true.
 
..................
pretty sure...........
I recall a conversation where you refused to budge on the matter
where I said exactly the same thing
 
But now there are different array models, where individual numbers or characters are not arrays.
BQN uses that model, and (I think) BQN also has the equivalent of , so you might want to hear from @Marshall for that matter
 
I'm pretty sure I had an aneurism over this exact thing.........
arguing that scalars are arrays
that everything in APL is an array
pretty sure
I remember the blood pressure spike that went along with that conversation
 
5:59 AM
That's not about arguing. The array model defines scalars to be or not to be arrays
If you disagree with the array model used in a language, you can use another language that implements a different array model.
 
I mean
it isn't a matter of disagreeing
its a matter of I've been over this so many times I have permanent red in my eyes as a result
and last time
the conclusion was
that what you said simply isn't the case
so either I've bounced into the berenstein bears timeline, or something is jank AF
 
@nathanrogers Yes, but only because it was by definition of the traditional array model.
 
yeah I'm not even talking about that any more
 
Now we have different array models that treat scalars differently
so your thoughts may make sense in that different array model
though it might be too late for you
 
the 1 of the tally of a scalar is indeed arbitrary (i remember trying to think of a single non-special-casey way to implement it, and couldn't).
(but fwiw the tally of a scalar is unrelated to whether a single number is a scalar. ≢⊂1 2 3 also is 1)
 
ngn
6:17 AM
@nathanrogers @Bubbler ≢0 is well-defined mathematically, it's the empty product = 1
 
No, it's not a product, it's the first element (of the shape)
 
@dzaima I noticed that. That's when I tested it with a numerical scalar... It's definitely the wrong answer
 
ngn
@Bubbler ok, and how many elements does a scalar have?
 
no matter how its specified
its an error on the part of the implementor
 
@ngn Product is the right way to count the number of all elements in the given array, but is a different matter
 
6:21 AM
@ngn the answer is either undefined or 0
never 1
 
@nathanrogers why is 0 better than 1?
 
@dzaima that's painfully obvious. an incessant parallel is drawn between the dimensions of vectors and arrays with their mathematical counterpoint. "Oh, but a vector is 1 dimensional, and oh, but a 2 d matrix is 2 dimensional, oh, but a scalar has no dimension which is why ⍴scalar returns ⍬ huehuehue"
if a scalar is truly a parallel for a mathematical point, it is that which has NO PART
if it has no part
how
OH HOW
 
ngn
ok, let's follow it through:
a b c⍴x has shape a×b×c
a b⍴x has shape a×b
a⍴x has shape a
what shape does ⍬⍴x have? empty product or..?
 
the fuck can you count it!?!?
 
@ngn this is about tally, not shape. In your example, the prettiest answer would be that ⍬⍴x is a :)
 
ngn
6:25 AM
@dzaima i have to start from somewhere
 
if you begin counting by incrementing from 0 by 1 for each thing you count (as this is how you count even but upon your fingers) but you have nothing to count, then you have counted to what number***??????????***
 
@nathanrogers I agree that an error is acceptable, but still, 0?
 
it has no part
I'ma start counting
uhhhhhhhhhhhh
0
1 2 3
oh, that has a part, let me start count
a-one, a-two, a-three, it has 3 parts
if you begin counting at 0, and increment by 1 for each thing, but there is NO THING because a POINT is THAT WHICH HAS NO PARTS
then 0
yes
 
ngn
@nathanrogers no need to shout
 
0 is literally the only logical answer
 
ngn
6:28 AM
not in a multiplicative context
 
@nathanrogers by that same logic 0 should be the answer to literally anything and everything that doesn't have a well-defined answer
 
in a context where there is a difference between a thing that is a list and a thing that isn't a list
@dzaima wrong
counting is clearly defined
we all know how to count
 
@nathanrogers counting is clearly defined on a list of things. You can't even get a list of the cells of ⊂1 2 to count them in the first place
 
counting is what is painfully clearlydefined here
 
ngn
array indices have additive nature, so naturally, ⎕io should be 0, but in a multiplicative context..
 
6:29 AM
right because I'm not counting the cells of ⊂1 2 because ⊂1 2 is a scalar AKA a POINT
which?
HAS NO PARTS
 
ngn
has 1 part - the point itself
 
no literally
that is the definition of a point
that which has no part
 
@nathanrogers that's definitely a very unrelated definition to an APL scalar
 
no it really isn't
 
ngn
no part in terms of surface or measurement, but it has coordinates. ask euclid.
 
6:32 AM
I cannot even begin to COUNT the number of times that parallel has been drawn, not only directed towards myself, but to literally any human being under the sun about why ⍴0 returns
man you all are just so flexible with how you choose which set of terms to use to describe a domain and when
you just... make them all up
 
ngn
we're talking about ⍬⍴, not ⍴0
 
and switch between them on the fly
when an analogy suits a given example, you make concrete claims that are inflexible... until another example crops up, and you don't even recollect your previous claims
 
@ngn the two are the same?
 
this isn't even about what ≢ returns anymore
 
ngn
@dzaima no
 
6:34 AM
@ngn ⍬⍴0, aka 0, is both ⍬⍴ and has the shape ⍴0
 
ngn
@dzaima ≢x⍴y does not depend on y
 
@nathanrogers I don't recall a single time a geometry point has been used to describe anything about scalars
 
@nathanrogers That's exactly how lots of mathematical theories were formed. Mathematicians make things up, and we can't grasp vast majority of those
An array model is also a mathematical theory.
 
ngn
@Bubbler you're a mathematician, and a good one. what is your reasoning for ≢scalar ←→ 0? i've always thought it was obvious it should be 1, and i'm in good company.
(good company = roger hui, at least)
 
@ngn To me ≢scalar is mathematically undefined. I don't particularly support it being 0 or 1 or any other value. I just believe defining it as 1 as a special case works good for practical programming.
 
6:41 AM
@nathanrogers what's your definition of "a part" that both describes that "a part" of 2 3 4 5 6⍴0 is 3 4 5 6⍴0, and that is also well-defined on a scalar to give an empty list?
(i'd guess originally was assigned to return 1 on a scalar to make it easier to write code that uses scalars as single-item vectors)
 
Feb 10 at 17:16, by Adám
A single number or character is a rank-0 array, a.k.a. a scalar.
 
ngn
@Bubbler "there are no axes" and "axes' lengths are supposed to be multiplied" sound like good reasons to accept the multiplicative empty product identity as the answer
 
Aug 18 '20 at 8:24, by Adám
@TessellatingHeckler Why not? A scalar is an array!
Aug 18 '20 at 8:17, by Adám
@TessellatingHeckler Hold it right there! In APL, a scalar very much is an array.
Apr 9 '19 at 20:34, by Adám
APL actually generalises data into a single uniform concept of an array (a tensor if you want) with a (tensor) rank, where a scalar has rank 0, a vector has rank 1, a matrix has rank 2 etc. All functions are generally applicable to all arrays.
 
@ngn That argument is still confusing ≢array (tally = length of leading axis) with ≢,array (count of all elements in the array)
 
ngn
@Bubbler they are, kind of, similar
 
6:47 AM
Nov 11 '18 at 17:41, by Adám
I'm just trying to convince you that there is no fundamental difference in the nature of a scalar and any other array. Free yourself from the notion and you loose one more unnecessary complication of thought.
Sep 4 '18 at 1:15, by Adám
@Οurous All arrays contain only arrays. Even a simple scalar like 42 is an array. An un-nested 0-dimensional array.
Aug 14 '18 at 20:21, by Adám
@Skidsdev A simple scalar is the whole of the array.
 
I must have
 
Aug 14 '18 at 20:11, by Adám
In a 0D array (a scalar), we need exactly 0 coordinates.
 
warped into some kind of alternate timeline
 
@ngn For a reduction analogy, ≢array ←→ ⊣/⍴array and ≢,array ←→ ×/⍴array. The latter has a well-defined identity element. The former has none.
 
or some crap
because this is just ridiculous
 
6:49 AM
And there are a lot more where they come from.
 
@nathanrogers Or, you may have just, you know, mis-remembered who held which position in the argument…
 
ngn
@Bubbler unfortunately apl arrays do not carry information about the group they are part of. a field has an additive group and a multiplicative group as subgroups.
 
I definitely recall my blood boiling when it became clear that not everything in APL is an array, and that the thing that was said to be not an array was the scalar
That is a conversation that happened
its crap like this that makes me believe in multiverse theory
because that is a real conversation
 
6:52 AM
Nov 9 '18 at 22:54, by nathan rogers
and a scalar is nothing but a 1 item vector
 
right
that was the assumption I had made
until I was corrected
like, I remember exactly where I was sitting
and what I was doing
and that it was a very long conversation
 
@ngn The important difference is that cannot even form a group.
 
@nathanrogers Examples of non-arrays in APL are functions and operators.
 
At this point I'm not even talking about that. but it doesn't matter
 
6:55 AM
Hey everyone, I made a dumb test reporting tool for writing unit tests. wohoo github.com/ndrogers/apltest
 
ngn
@Bubbler why ⊣?
 
@ngn because ≢array ←→ ⊣/⍴array
and we've been talking about tally of a scalar (for several hours already), not the count of elements of a scalar
 
ngn
@Bubbler that loses the "multiplicative" quality of the shape
 
Nov 21 '18 at 21:42, by nathan rogers
but then according to @Adám s definition of array from earlier today, "nonragged", then not everything is an array
 
ngn
@Bubbler proper apl (in a sense) but not proper linear algebra
 
6:59 AM
@ngn it might be a good reason, but by no means at all be a definition. It's talking about a constant number of a single axis, so anything that may apply to many of them is unrelated imo
 
@ngn Does linear algebra have a definition for tally?
 
ngn
@dzaima i imagine a shape as an array followed by an infinitude of 1s. it may be wrong in an apl sense but i think it's closer to mathematica truth.
@Bubbler i guess
@Bubbler you can multiply a vector by a scalar and get something non-empty, can't you?
 
@ngn right, ⊃1,⍨⍴x is one definition, but it's still just special-cases scalars, and the 1 is still gotten from the multiplicative identity which is used because Reasons™
 
ngn
@ngn i mean generally an m×n array +.× an n×p array give an m×p arrary, right?
 
@dzaima The multiplicative identity makes sense. You want ×/⍬ to be 1 and +/⍬ to be 0.
 
7:07 AM
@EliasMårtenson I understand why ×/⍬ is 1, but not why that is at all related to a single given item of a shape
 
ngn
i must disappear, but i'd like to say i have absolutely no doubts about ≢'s definition in the context of linear algebra, and roger absolutely rocks there.
 
⋄ 'Hi'
 
At this point, we should poll all the APLers about what they think of ≢scalar
 
heh, ≢0 is like 0÷0
 
In a scale of 0 to 10 where 0 is "it should obviously be undefined" and 10 is "it should obviously be 1", with an extra choice for "I have a totally different opinion"
 
ngn
7:10 AM
@ngn (not trying to appeal to authorty, just to maths and common sense)
@Bubbler if maths was a democracy.. (in the popular understanding, i.e. voting) :)
 
@Bubbler what is the equivalent of undefined in apl
 
@Razetime DOMAIN ERROR
 
hmm yeah sounda bout right
I'd say 0
 
as in "obviously undefined"?
 
yes
 
7:25 AM
It'd be interesting to go through some relatively newly written code and see how often is actually used where the argument can be a scalar.
 
I'm currently at 2 or 3, where "I strongly feel it's mathematically undefined, but special-casing it as 1 is an OK compromise for programming purposes"
It's not a joke, it is really like 0÷0 problem, in that different analogies are giving different answers to the ≢0 problem
 

« first day (1499 days earlier)      last day (1145 days later) »