« first day (1368 days earlier)      last day (33 days later) » 

1:38 AM
<ldbeth> /# lisp
<ldbeth> help
 
1:49 AM
<moon-child> ⋄5+⍳9
6 7 8 9 10 11 12 13 14
<moon-child> ldbeth: ^^ eval stuff like that
 
 
2 hours later…
4:18 AM
does anyone know how to typeset APL(Dyalog) code inside Latex? e.g you can use Verbatim to enclose Python code inside Latex, I want to enclose APL code inside Latex,
I know there is Latex package called wasysym to render APL symbol inside Latex, but If I want to enclose APL code literally inside Latex. Package wasysym does not help because it is only render APL symbol. When I copy APL code to Latex and enclose with Verbatim, then APL symbol can not be display properly.
 
5:03 AM
<moon-child> @elliptic00 if you use lualatex or xelatex, you can use unicode characters directly and it'll Just Work
<moon-child> note you may need to set an alternate font to actually get the apl glyphs; see fontspec
 
 
6 hours later…
11:34 AM
@RGS I googled for it and downloaded. Not sure where it was but I have it here if you want it.
 
ngn
12:03 PM
@EliasMårtenson does your impl have an online demo?
nvm, i found the answer in the readme: you're waiting for kotlin+js+reflection
 
@EliasMårtenson redoing my (dzaima/BQN) pretty-printing formatting. Decided to go with using proper BQN values as the storage format, meaning I can use matrices for the results and even inline BQN code; The elements of the matrix can be characters, or a string of a grapheme cluster, meaning that in the 99.9% case I work with efficient data, and when there are grapheme clusters, it just quietly switches to being quite a bit more inefficient, but still would work properly.
 
12:22 PM
@dzaima Oh, that's clever. I might adopt that method too.
 
@dzaima (to note is that i'm actually too lazy to actually find grapheme clusters, this is just for working around UTF-16 breaking doublestrucks for now. but adding those should "just work")
 
@elliptic00 Two methods for APL in LaTeX described on APL Wiki and here.
 
12:54 PM
@dzaima (if i wanted to add coloring information (i.e. ANSI color escapes), i could squeeze that info into those "extended charaters" without breaking formatting too, though then the format would necessarily always be in the inefficient mode)
 
1:36 PM
@ngn Yes, indeed. Perhaps it's already there. I haven't checked the latest updates.
The documentation still says it's not available yet: kotlinlang.org/docs/reference/js-reflection.html
 
@EliasMårtenson curious, what's the need of reflection for?
 
I honestly don't remember which call failed. Let me try a JS compile and see where it buggers out.
 
1:47 PM
@dzaima I just tested, and I can actually compile for JS now. Now that I think about it, I believe at the time the KClass object wasn't even available.
 
:D
 
Thank you. I'll need to implement some functions that needs to be made available on each platform which the Kotlin multiplatform libraries don't provide, and then I might be able to create a "try-KAP" site :-)
 
ngn
@EliasMårtenson great news for those of us who are too lazy to compile :)
 
2:23 PM
@ngn Trying to get everything to pass in JS. Right now the status is: 44 failed tests / 467 succeeded.
So for the most part things seems to run. Now the issue is Unicode support. I haven't done any javascript in a very long time. What is the Unicode API I'm supposed to use? I need to do things like split strings into grapheme clusters, and decode UTF-16.
@ngn Do note that the graphical interface (you can call it "IDE"), is only available on the JVM version
 
@EliasMårtenson no clue about grapheme clusters. All i know is that [...s] splits s into characters, but also splits graphemes
if you wanted graphemes, you'd probably either need to write your own or use some random library it seems
 
@dzaima Yeah, that's what I was worried about. The problem with JS is that I bring in a small library and all of a sudden I have 3000 dependencies.
Is there a defacto-standard Unicode library for JS?
 
@EliasMårtenson i doubt it
 
ngn
@EliasMårtenson i don't think you need any libs. js strings are unicode-enabled.
to split into characters: s.split('')
 
@ngn do you have a way to split "aåb" into ["a","å","b"]?
@ngn that's even worse than [...s] - compare [..."𝕩"] and "𝕩".split('')
 
2:31 PM
Just from searching now, grapheme-splitter has zero dependencies.
 
ngn
@dzaima would this work?
do we care about anything other than latin?
 
@ngn i see suggestions of libraries, a function with "NotVeryWell" in the name, suggested readings, and code only handling emoji
@ngn this is not k
i personally don't see too much of a reason to bother with graphemes, but i won't stop someone wanting to do unicode properly
 
ngn
i mean, do we care about diacritic marks over any script other than latin. i understand that unicode is involved, unlike in k.
 
@Marshall Thank you. I will look at that one.
Still working on manually implementing an UTF-16 encoder in JS.
(to avoid dependencies)
 
@EliasMårtenson UTF-16 encoder from what? array of codepoints?
 
2:40 PM
@dzaima KAP already does Unicode mostly properly, and I have testcases for it, so I need to get it to work right in JS :-)
@dzaima Yes. Well, a single codepoint and output a string.
 
@EliasMårtenson String.fromCodePoint(120169)
(and for the opposite direction, "𝕩".codePointAt(0) (though the 0 is redundant here))
@dzaima (fwiw that works with varargs - String.fromCodePoint(120168,120169) (or, equivalently, String.fromCodePoint(...[120168,120169]) but note that there's some stupid varargs size limit))
 
Nice, thanks!
Hmm, seems like String.fromCodepoint is not available in Nodejs?
 
@EliasMårtenson seems available to me (v10.19.0)
@EliasMårtenson (also capital p)
 
<klg> (also m)
 
klg: that was edited away on the SE side
 
2:52 PM
nodejs?
 
@Razetime nodejs. javascript without a browser
 
@dzaima Perhaps Kotlin uses an older version, because I can see it in my browser (as expected) but when I call it from Kotlin is says that the function is not defined.
 
ngn
@EliasMårtenson why bother recognize graphemes at all? apl doesn't use any
 
@EliasMårtenson wouldn't String in kotlin be different from the String in js?
 
yeah i know that, whats they doing in nodejs with apl
 
3:02 PM
@Razetime making an APL impl run in JS
some Java after 8 has Character.toString(codepoint), but that doesn't appear to be in kotlin either
@ngn but the user of the language might, and getting ugly boxes is not fun
 
@ngn Well, the main reason is that KAP has a function called unicode:toGraphoemes which performs this conversion. It's used by the formatter to make sure that output is aligned properly.
@dzaima It is actually available in Kotlin, but it's called Char.toChars(codepoint)
Hmm, my next problem in getting this thing to run in JS is how to deal with the standard library. The underlying function loads a file off the filesystem, but that doesn't work in the browser.
 
3:18 PM
@EliasMårtenson that gives a CharArray instead of a String though. but it's easy enough to wrap that in a string anyways
 
@dzaima Yes, but CharArray has a method called concatToString
So it's just Char.toChars(codepoint).concatToString()
 
@dzaima (new String(Character.toChars(c))) is indeed what i do in my impl due to being restricted to java 8)
@EliasMårtenson String(Char.toChars(codepoint)) is shorter :p
 
@dzaima True, but IDEA will recommend changing it :-)
Is the dzaima APL written in plain Java?
 
@EliasMårtenson yeah, limited to 8 because Android
 
@dzaima Perfect use case for Kotlin :-)
 
3:21 PM
@EliasMårtenson ah. using the online playground currently because am too lazy to get a local test playground
@EliasMårtenson i don't like some things about kotlin (and can't be bothered to estimate whether the good parts are worth it), so am forced to stick with java, awaiting the day i write my own language specifically for myself
 
Hmm, grapheme-splitter hasn't been updated in 2 years, meaning that it'll probably have problems on any new characters in the latest versions of Unicode.
@dzaima I agree, there are some truly annoying thing about Kotlin. But the benefits outweigh for me.
 
ngn
@EliasMårtenson can kotlin's js compiler export functions? maybe export an eval() and call it directly from js
 
@dzaima (particularly, i really don't like it switching away from primitive types. Ideally, it would make primitive types (i.e. ones without identity, pass-by-value) first-class, but that's obviously impossible if wanting to remain compatible)
@dzaima (still hoping Valhalla, JEP169 and JEP218 happen within this century)
@dzaima (Valhalla, actually, like, mostly works, but without generics for value types it's pretty useless)
 
4:03 PM
@ngn The KAP standard library is written in KAP, so I just need to be able to open a file. I guess in the browser case, I'll just download it from the server URL.
I've reached a point where the only ailing test cases are the ones that require the stadnard library.
 
ocool
 
Oh no. Now this is an interesting, and frustrating, problem. The IO functions in JS are all asynchronous. But of course I want to have synchronous operations.
 
ngn
4:19 PM
@EliasMårtenson yes! that's a problem i have too
@EliasMårtenson my solution to that was to implement my own super-simple file system and syscalls that work with it. probably not applicable in your case because java..
 
@ngn Well, I do the same actually. I think :-)
 
ngn
@EliasMårtenson you can't. the sheer amount of syscalls java makes just at startup is prohibitive.
 
I have build a simple file access API. It's needed because Kotlin multiplatform doesn't contain a standard IO API, so you have to do that yourself. So in my case, the JVM implementation calls into the Java libraries and the Native implementation calls into read/write, etc.
However, now I need to implement the JS version, which is tricky because I don't think I can read a file/URL synchronously in JS?
 
ngn
@EliasMårtenson from a browser you can't read real files at all, but you can pretend that something is a file
 
Another way to phrase my issue is that I somehow need to be able to implement a function with the following protoype in JS: String readContentFromSource(String filename)
@ngn Of course. The filename can be a URL
But there is no such function in JS, is there?
 
ngn
4:27 PM
your "filesystem" could be a js object (all js objects behave like hashmaps) with filenames as keys and content as values
 
Oh wait. Sorry. There does seem to be a way to do synchronous IO.
Need more research :-) Is it obvious I havent' used JS in a long time? :-)
@ngn Good point. For the stadard library, that's a good idea.
Then it can be embdded in the code.
 
@EliasMårtenson If you're going to be displaying results in the browser, could you format as HTML, with tables? You'd want a fallback to use for Node from a terminal, but that seems like a more elegant way to display things.
 
4:45 PM
@Marshall Sure. That should be trivial.
First I need to figure out how to convince Gradle to somehow allow me to embed the content of a file as a string in the Javascript output.
 
ngn
5:10 PM
marshall and dzaima are like angels on your shoulder whispering "do more, more" and i'm like a little devil: "do less, less" :)
 
what happens if "less is more"?
 
@ngn OK, there seems to be no simple way of embedding data in a JS project with Kotlin multiplatform at the moment. So I will take a hybrid approach: In the init code, I will do async loading of all the library files that will be needed. They will then be stored in a hashmap and served as recommended by you.
That's a project for tomorrow.
Time to sleep soon :-)
 
@ngn With HTML tables you probably don't have to use grapheme splitting (who would seriously use the Node version over Kotlin?), so I think I'm saving work here. Sure, the browser has to render the tables, but that's what browsers do.
 
Progress. I hope the next commit will activate support: github.com/lokedhs/array/commit/…
 
ngn
@Marshall i don't think he really needs grapheme splitting in the first place
@TessellatingHeckler hell freezes
 
5:15 PM
But I like the picture that God created the universe and the devil was sitting there saying "dude, that's a pretty big codebase…"
 
@Marshall I managed to get the grapheme stuff to work correctly in JS, so it's all good :-)
 
ngn
@Marshall have you seen the leaked source code? void givePeoplePurpose() { /* todo */ } void removeEvil() { /* todo */ }
 
Also, note that the grapheme splitting is available to user code in the language itself, and the standard library uses it, so I can't avoid it.
 
@ngn I hate programs with strong opinions about how you can use them though.
 
ngn
:D
 
5:18 PM
@ngn here i'm not even saying "do more", i'm saying "go ahead, don't do less". And as I've said before, I don't like the mindset of doing less for the singular purpose of doing less
 
ngn
i might have a more evil purpose in mind. poorly concealed diabolical laughter
 
Who was it that asked me why I couldn't compile to JS? Probably @Marshall
 
@EliasMårtenson i asked why was reflection needed
 
Whoever it was, it's your fault I spent hours messing around with one of the languages I hate most on this very earth :-)
 
:p
 
ngn
5:23 PM
definitely marshall
 
I hate it only marginally less than Python
"it" being JS of course. If it wasn't obvious.
 
ngn
@EliasMårtenson does kotlin compile to wasm or actual js?
 
@ngn Actual js it would seem. It drops a big JS file which is clearly my code in JS form.
I seem to recall reading something about them wating to support wasm eventually.
 
Given a date, is there a way to tell what day it is? (Monday, Tuesday...)
I couldn't find anything on aplcart or in dfns
 
@rak1507 given a date in what format?
 
5:28 PM
@dzaima I am not sure yet, basically anything
 
@rak1507 sure, take date in the format yy/mm/dd, day-of-week, hh/mm/ss :p
 
lol, well, something like ⎕TS would be ideal
 
possibly 3⊃⊃¯11⎕dt ⊂⎕ts (in ⎕IO←1)?
 
Next question, how can I get an array of days between two particular dates
 
@rak1507 convert both to dyalog date number (if applicable) with 1⎕DT, get a list of numbers in between the two numbers, convert back (if applicable)
 
5:49 PM
@EliasMårtenson I definitely didn't ask this, but I don't see anyone else here asking either. Was it even in this room?
 
4 hours ago, by dzaima
@EliasMårtenson curious, what's the need of reflection for?
 
6:06 PM
Just pasted something large into Dyalog, and it started beeping! Did not expect that
 
6:50 PM
@rak1507 (Dyalog has more resources than dzaima, but Oracle/JVM has more resources than Dyalog). Might be speaking out of turn here, but Dyalog surely has more code paths to handle configurable ⎕IO, migration level ⎕ML, comparison tolerance, debugger hooks, parser that has to be able to cope with namespaces/classes/tradfns, and so on which will add some overhead.
Where Dyalog can optimise and gain performance: stackoverflow.com/questions/56878632/…
 
I hadn't considered that, but yeah that makes sense. Thanks @TessellatingHeckler :)
'Segfault—do not pass go; do not collect the elements of the original array into a list.' lol
 
7:04 PM
Yay. I just committed javascript support
Next step is to build some web application that can run this thing in a browser.
 
@EliasMårtenson If you'd like to start with BQN's online REPL (mostly in repl.js) you're free to. I can waive the ISC (like MIT) license requirement so you don't have to bother with copying the license as well.
It's adapted/rewritten from the ngn/apl one in case you'd like to reference that.
 
ngn
@TessellatingHeckler whenever i read "faster than c", my brain starts screaming "bullshit"
 
@Marshall Thanks. I'll take a look.
 
@ngn I'd link to "C is not a low level language / your computer is not a fast PDP11" and wonder why it shouldn't be possible to do things faster than C does them, but I'm a high-level-language casual scripter, so :shrug:
 
ngn
7:28 PM
for a certain class of problems well-written apl could be faster than poorly-written c. "apl is faster than c" is the yellow-press version of that.
 
7:44 PM
@ngn If you're claiming it can only beat poorly-written C then you have a very expansive definition of "poorly-written" though.
 
ngn
if it's slower than apl (an interpreted language, itself written in c), it's definitely poorly written :)
 
@ngn i'll agree that "faster than C" rarely means "practically noticeably faster than any C", but just being "faster than c that most sane people would write" isn't that hard
 
ngn
yeah, we could argue about contributing factors other than speed of execution. in that sense is c faster than assembly?
 
@ngn The program {((⊢⍱≠\)'"'=⍵)/⍵} removes quoted sections from a string. I will be quite impressed if you can demonstrate a well-written C equivalent.
 
ngn
@Marshall any apl expression you can think of - collect the fragments of the interpreter that interpret it, put them in a c file and compile it, it should be no slower than the original
 
7:56 PM
@rak1507 7|1⎕DT⊂y m d
 
@ngn but would you (or literally anyone) actually do that if you wanted to write C code to remove quoted sections?
 
@rak1507 It beeps if you try to type/paste more than the REPL max input.
 
@ngn I will be quite impressed if you can furnish those parts of Dyalog's current source code, but I don't consider that explanation to be a demonstration.
 
ngn
@dzaima of course not :) see my previous comment
 
@ngn If you're writing more assembly than a single specialized tight vectorized loop that you've spent quite a while thinking of the best way to do, i would assume the likelihood of c being faster to indeed be quite high.
 
ngn
7:58 PM
@Marshall goes both ways. what if someone showed you a piece of complicated c and asked you to rewrite it in apl for comparison?
 
@ngn removing quoted sections isn't "complicated APL"
 
ngn
@dzaima but it's an example marshall picked for something apl is good at
 
@ngn The claim isn't that C can't be faster than APL, but that APL can be faster than C. You'd agree that I gave a simple task that any competent programmer could solve?
I just think it's weird to use "well-written" to mean something that most competent programmers couldn't produce.
 
ngn
@Marshall so, c can be faster than apl, and they are even?
simple task - yes, but it was also a task that lends itself to array programming
 
@ngn then the next question is how often which is the case, given the specific problem domain
 
8:02 PM
@ngn No, C is better for performance in general (but programs are slower and more costly to write). Doesn't change the fact that if you have a good fit for array programming then you want APL.
 
ngn
@dzaima what is the given problem domain? (i did write "for a certain class of problems..")
@Marshall then we are in agreement. why are we arguing? :)
 
@ngn that's the part that varies between users
@ngn (you also wrote "well-written apl" and "poorly-written C", which were more of a dispute)
 
@ngn Because you're using terms in strange ways ("bullshit", "poorly-written") to describe your opinion?
 
ngn
yes, "apl is faster than c" is a bullshit statement. it aims to present apl in a more positive light than it deserves. it distorts the truth by failing to mention the conditions under which apl is faster.
 
@ngn You dropped a "sometimes" from the original source. I think "APL is sometimes faster than C" is useful and not misleading, and it's usually discussed in the context of explaining when it might be better.
 
ngn
8:11 PM
@dzaima if someone knows what s/he's doing in c, there's no way you can beat their program with apl. maybe apl would take less time and fewer characters, maybe it will be easier to write, but ultimately c has more ways to map to machine code, and they are a superset of the array-oriented paradigm, for better or for worse.
 
And I think the "proof" that APL can't be faster than C is misleading, because it invites the reader to ignore that Dyalog is implemented in non-portable and very sophisticated C.
 
ngn
c nonetheless
 
@ngn If by "knows what s/he's doing in c" you mean "is omniscient". That phrase usually doesn't imply knowledge of original and unpublished algorithms developed at a small British software vendor.
 
@ngn how about this: "for a certain class of problems, reasonably written APL (i.e. what most APL programmers who know how to write optimized code would write without a specific request for performance) can often be faster than reasonably written C (i.e. what most C programmers who know how to write optimized code would write without a specific request for performance)"
 
ngn
@Marshall so: i know a secret fast algorithm to solve a certain problem. i write it in (say) python. you write your solution in (say) java, without knowing my algorithm. therefore, python is faster than java.
 
8:18 PM
@ngn APL developers don't need to know Dyalog's algorithms in order to use them. Plenty of programmers could write {((⊢⍱≠\)'"'=⍵)/⍵}.
 
ngn
@dzaima that's a lot more true than "apl is faster than c" :)
 
@ngn and i believe noone actually said "apl is faster than c"
 
The original is "I am interested in how APL is so efficient at what it does, to the point of sometimes being benchmarked as outperforming C." That's very objective and I'm pretty sure it's true as I've personally made such benchmarks.
 
ngn
@dzaima the op of this q read it in a benchmark and assumed it was true. no-one corrected him.
 
ngn
8:23 PM
@dzaima no-hyphen-one ;)
 
@ngn I 100% believe the OP could have seen a benchmark showing exactly that (whether the C side of the benchmark contained the specific inline asm to make it faster than APL is another question), and they even qualified that with "sometimes"!
 
@Adám clearly not that I guess lol
 
@ngn noone is unambiguous and shorter.
@rak1507 But I'd like to know what you did search for, so I can add those terms. (And I'll update those expressions to 18.0 too)
 
I honestly can't remember, and day of week is clear enough so I doubt anything needs to be added
 
@Adám i'd think including the non-mod-7 versions would also be good for the part of the world that does that
 
ngn
8:25 PM
@Adám just joking about it
 
@dzaima What do you mean?
 
@Adám ah, the 7| is a necessary part in the APLCart expression. just the difference between sunday being day 7 and day 0 is what i was alluding to
 
Actually, it'd be useful to have a generalised "change 0s in collection of numbers in range 0…n into n+1".
 
@Adám that'd require an n of 6 here, 0…(n-1)1…n would be what i'd expect
 
Whatever.
CMC: Given an upper limit m and a flat integer array a where all are in range 0…m-1, change all 0s into ms.
 
8:35 PM
⊣@(0=⊢)
 
@rak1507 Nice. You can golf 0=⊢ to
So in Extended, the elegant ⊣@= would do :-)
 
ಠ___ಠ SOGLs which should do exactly this (minus mapping) fails on 0
 
@Adám wouldn't using ~× take more characters because my example is a train which takes a left argument, so I'd need to bind it to ⊢ or something
And I don't quite get how ⊣@= would work
 
@rak1507 the right operand of @ only gets passed the right argument
@rak1507 in Extended, monadic = has an implicit left arg of the prototype (so it's just equal to {0=⍵} here)
 
@rak1507 I mean ⊣@(~×) where is an atop: "NOT sign" (and we know there are no negatives).
 
8:40 PM
Oh that's really cool, I didn't know the right operand of @ only got passed the right argument
 
I'm having too much fun with this bug: ⋄ ⎕FR←1287 ⋄ Inf←⊃1E4000*2 ¯2 ⋄ ÷Inf ⋄ NegInf←-Inf ⋄ 2*NegInf ⋄ NaN←0×inf ⋄ NaN=NaN ⋄ NaN≡NaN
 
@Adám
0

0
VALUE ERROR
VALUE ERROR
VALUE ERROR
 
@DyalogAPL Uh, sure, I wrote inf by mistake, but that's way too many results!
⋄ ⎕FR←1287
Inf←⊃1E4000*2 ¯2
'÷Inf:',÷Inf
NegInf←-Inf
'2*NegInf:',2*NegInf
NaN←0×Inf
'NaN=NaN:',NaN=NaN
'NaN≡NaN:',NaN≡NaN
 
@Adám
÷Inf: 0

2*NegInf: 0

NaN=NaN: 0
NaN≡NaN: 1
 
8:53 PM
That looks wrong.
 
sure does
 
ngn
@Marshall in order to call the results "objective" you shouldn't be the one writing both the c code and the apl code. objective benchmarks should be adversarial.
 
@ngn the statement is objective. The benchmarking possibly not being is unrelated
 
ngn
@dzaima yes, i agree the op's statement is objective. i was referring to marshall's own benchmarks.
 
afaict marshall wasn't saying the benchmarks were objective either (and any "objective" benchmark of runtime performance cannot beat C anyways as it has inline assembly)
 
ngn
9:00 PM
hm, ok
 
and if C is so good, why make ngn/k?
@ngn (fwiw i did think about that conversation while writing that "noone" :D)
 
ngn
for the same reasons apl is made - for a certain class of problems it's easier to write fast code in k/apl
 
well there you go.
@dzaima also
 
ngn
it won't be as fast as natively written c. it just makes a different sort of trade-off. it would be false advertisement to tout it as "faster than c".
 
@dzaima Because optimisations. But yeah, NaNs are bad. To quote Roger Hui:
> My feelings about NaN ("real hideositynesshood") come from years of dealing with it in J. The bad thing about it starts with the following property, namely NaN=NaN is 0 (false). Whatever benefits obtain from NaN are not worth throwing out the property that x=x is true. Throwing it out will bite in unexpected ways.
@user677578 OK, I'm on it. No need to email again. (I can see your ID only when you're here.)
 
9:14 PM
@Adám yeah. i decided for dzaima/APL to just ignore NaN behavior
 
ngn
@Adám in other words: breaking reflexivity of = is bad but breaking transitivity of = (⎕ct) is okay :)
 
@Adám speaking of, ⎕CT doesn't appear to work
 
@dzaima I bet you have a lingering ⎕FR←1287 from your previous escapades. Use ⎕DCT instead.
 
9:30 PM
@Adám happens on a fresh restart
 
@dzaima Ouch, that's serious. Thank you so much.
 
9:46 PM
 
10:27 PM
I'm reading Notation as a Tool of Thought with a bit of background in J, but none in APL. To clarify, does APL use column major order, but print on one line when the array to print has only one column?
 
@user677578 APL is row major.
Sometimes people will use an "inverted table", which is a vector of column vectors, but there's no support for treating inverted tables as matrices.
Strictly speaking I guess there's nothing stopping an implementation from using column-major order, but it conflicts with ravel order so I've never heard of any implementation doing that.
 
11:29 PM
@dzaima What are these two showing?
 

« first day (1368 days earlier)      last day (33 days later) »