« first day (2051 days earlier)      last day (134 days later) » 

3:00 PM
Yeah! I just got my first email from the government of Nigeria.
 
Congratulations!
 
I was apparently trying to withdraw money from my retirement account, and the US government put a huge fine on me.
 
Except for the numbskull that did some wiring on a place I used to own. Wired the high power plug as 220.. effed up a weed eater
 
But the benevolent government of Nigeria is going to reimburse me!
 
@Hosch250 Aw, they're such a great people, yo.
 
3:02 PM
I think I want to transfer my citizenship :love: :P
 
I honestly don't know why they heap on hate on those nice Nigerians who are busy helping others like us.
@SmileyFtW oof
 
yep
 
3:21 PM
in WPF why would one do this?
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
when it could be simply:
<Setter Property="Foreground" Value="{StaticResource SystemColors.GrayTextBrushKey}"/>
 
overnight ETL completed in 181 minutes last night. I'm half ecstatic and half panicking.
3-month average duration: 30.5K seconds. last night: 10.8K seconds.
...and it looks like everything indeed did complete
 
Went from 9 hours to 3?
Nice job!
Now, of course, the real challenge is to get it from 3 hours to 3 minutes :P
 
all I did was splice up the giant .dtsx package into smaller ones
@Hosch250 not going to happen, but if I can get order detail units to process in 10 minutes instead of 50, I'll be very happy!
@this FYI here's the TVF:
ALTER function [dbo].[BucketString] (
	@values varchar(max),
	@bucketSize int,
	@bufferSize int = 1,
	@offset int = 0)

returns @result table (id int, item varchar(max))

begin

	--declare @result table (id int, item varchar(max))

	--declare @values varchar(max)
	--set @values = '14.0 14.5 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 ODDS'

	--declare @bucketSize int
	--set @bucketSize = 4

	--declare @bufferSize int
	--set @bufferSize = 1

	--declare @offSet int
	--set @offset = 0

	declare @maxBuckets as int
the actual current, live one
plus chat markdown mangling the tabs/indent :)
@this should be static, yes
 
so it's actually a mTVF, not iTVF. That's going to hurt.
 
that's m vs i
?
it does hurt!
 
3:28 PM
multipe statement vs inline
the optimizer cannot inline that TVF
it's basically a black box
 
i hope the optimizer is at least smart enought to execute it only exactly once
but for all I know it might be doing that more than one time.
Hence the suggestion last night to consider using a temp table if you can
 
hm? my understanding is that it would be running it once for each agonizing row
 
Yes, it will but I'm referring to whether it need to do it more than once per the source table because of how it gets joined/applied
 
here's one example:
		declare @issuedUnits table (
			 OrderDetailId int not null
			,SizeId int not null
			,Units int
			,unique(OrderDetailId,SizeId)
		);
		insert into @issuedUnits
		select
			 OrderDetailId = dw._Id
			,SizeId = sz._Id
			,Units = issued.Units
		from Staging.dbo.YYF641SAV f641
			inner join Staging.dbo.YYF391 f391 on f641.f12 = f391.f5 and f641.f13 = f391.f6
			inner join NDS.dwd.FiscalCalendars t on f391.OrderDate = t.CalendarDate
			left join NDS.dwf.OrderHeaders h on f391.f5 = h.Number and t._Id = h.OrderDateCalendarId
key pain point being cross apply (select id SizeIndex, cast(item as int) Units from Staging.dbo.BucketString(f641.f22,4,0,0)) issued, I'm guessing
 
3:32 PM
yeow. and it looks like you are filtering issued.Units <>0. There's lot of other joins, too
 
@this reasons... Probably not very good ones, but reasons...
 
I believe (but dont' quote me) if you see the same issued appearing more than once in the execution plan OR it has rebind > 1, then it's getting executing more than one time.
 
then there's orderedUnits and shippedUnits cross-applying the TVF on similar aggregates from a different YYFxxx table
 
I read the TVF, and I don't see a reason why it can't be made into iTVF
 
3:34 PM
TVF (BucketString) Cost: 8%
 
If you don't want to do the temp table (which would be most easiest), I would convert into iTVF
 
then nested loops (inner join) -> 34%
#temp table?
 
Remember that cost estimation are usually too low for black-box operations like mTVFs
Execute the TVF once, insert into a temp table, then use that temp as the join instead of cross apply.
That way, you denormalize the entire set of data in the source only once.
 
@SmileyFtW alright Alright ALRIGHT! We got us a learner. Way faster than I was.
 
*normalize
 
3:36 PM
LOL. Yes, normalize.
 
when you say "execute the TVF once", you mean "once per record"?
 
been lurking... and reading Mug's blog... over and over again... LOL
 
just to be sure - I can't wrap my head around how I'd get that function to run just once for the whole table
 
no, I mean once for the entire set of the source table
 
hm.. I'd need a new Type, no?
 
3:38 PM
To confirm. All the data is there: f641.f22?
 
or some way to feed it with a table rather than a string
@this for units issued, yes
units ordered are in another table
units shipped in yet another
 
Ok, so you only need to select only that and the key from the f641
then create a temp table that has the parent id & normalized data (using TVF) for the unit issued.
I guess you'll have to do it for ordered and shipped separately but that's OK. At least you are normalizing the data only once, and creating temp tables that then can be indexed.
 
I like how google just autocompleted "tsql pass" to "tsql pass table to function"
scary accurate
 
For example, you have joins on issues.SizeIndex - that's where you want an index
 
yeah
hm, been using in-memory table variables thus far (@table ..right?), ..bad idea?
 
3:43 PM
Apparently Ubuntu 18.04 is notorious for the blank purple screen of death :'(
 
BTW, it might be possible to make do with a generic type; if the input is always 2 columns, then you can just create a table type with only that and stuff the appropriate table, its key and its denormalized crap data and send it to the function.
@table isn't necessarily in-memory.
 
I wonder if 19.10 would be better?
 
If you want to use in-memory, you need to natively compile your procedure & tables
Given that they are temporary, you might see some benefit. Need testing, though.
hmm, but then again. You can't use b-tree index on a memory table, I think. They can only have hash index.
 
@Hosch250 you want to prefer the newer version anyways
 
3:44 PM
18.04 is the LTS.
19.10 isn't LTS.
I'm not sure I can download the ISO and Rufus it onto my disk anyway, running in the "test without installing" mode from the same disk :D
 
20.04 will be LTS again according to schedule and you want a quick upgrade path if necessary
 
OK, but I still want my computer back ASAP....
Any ideas for getting into grub from the blank purple screen so I can disable the splash page?
That seems to be the #1 cause of this issue from doing web searches.
 
no, not really
 
:/
 
but you should be able to edit the grub config from the "test without installing" version
 
3:47 PM
The /etc/default/grub file?
 
you may need to remount the drive as rw instead of ro before that works
 
So, I go in and re-mount my internal drive while running that version.
And then I try to edit the file.
OK, got my computer and trying it
At this point, I don't care about the lost Windows install. I need to learn Linux sooner rather than later anyway.
 
#YouHaveBeenWarned
 
OK, I'm on my home computer.
How do I mount the drive again? Just mount '512 GB Volume' -rw?
I unmounted it from my Files application.
 
3:59 PM
mount /dev/sdb1 -rw
 
Do I put sudo before that?
Because it says I'm not in as root :)
 
yea you do
alternatively you run that as superuser, but that's more dangerous
 
Says "can't find in /etc/fstab"
 
wat
 
In the Files thing, it's showing it as /dev/nvme0m1p2.
Should I use that command instead?
 
4:01 PM
ehhmmm... not sure what exactly you want to mount ...
 
It has "Computer" as /, and my internal drive as "512 GB Volume" as that.
 
so ... you need to use the device specifier that you want to mount
 
> If I knew what file (or files) are duplicates could deleting one (or both) resolve this?
 
dev stands for "device" in that context, so that's why you can also find things like "usb1" in that pseudofolder
 
Oh.
Well, I'll try what it's showing me as the path in the Files thing.
Same error :'(
 
4:03 PM
nvme acually sounds like it could be your graphics card ...
 
It's my internal SSD.
My internal is 512 GB, and my external is 256.
 
try running mount without any arguments and check whether you find something in there already
 
Lots.
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=8008804k,nr_inodes=2002201,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=1606712k,mode=755)
/dev/sda1 on /cdrom type vfat (ro,noatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
 
check out what's inside /cdrom
seems somewhat ... inappropriate to mount a hard drive to a folder named "cdrom"
 
There shouldn't be anything, LOL. I don't have a CD reader on this computer.
I can't see that drive in my files app.
Just Computer and 512 GB Volume.
 
4:09 PM
the files app is basically making stuff up for you
 
OK, I ran ls on it.
ubuntu@ubuntu:/cdrom$ ls
EFI autorun.inf install pool
README.diskdefines boot isolinux preseed
'System Volume Information' casper md5sum.txt syslinux.cfg
autorun.ico dists pics ubuntu
ubuntu@ubuntu:/cdrom$
I wonder what happens if I execute autorun.ico...
Some of them are green, some are blue.
 
the green and blue comes from different permissions
green is executable
 
I'm guessing that's my Rufus'ed thing. Remember that I'm in the "preview" version.
Probably just legacy from back in the day when things were usually loaded from DVD, not from USB sticks.
 
yea, that's ... weird
 
OK, I think I have a solution.
How do I run TextEditor as root?
If I'm in as root, I can read/write the file, the permissions are saying.
 
4:15 PM
just put sudo in front
 
From the launch screen?
 
nah, in the terminal
 
So I just sudo TextEditor?
 
sudo gedit [file]
or kate instead of gedit
 
OK. So now I need to find the file...
Oh, NVM.
OK, so that opened it and let me edit and save it, but didn't really save it and output this:
(gedit:5525): IBUS-WARNING **: 16:16:56.722: The owner of /home/ubuntu/.config/ibus/bus is not root!

** (gedit:5525): WARNING **: 16:17:05.412: Set document metadata failed: Setting attribute metadata::gedit-spell-language not supported

** (gedit:5525): WARNING **: 16:17:05.412: Set document metadata failed: Setting attribute metadata::gedit-encoding not supported

** (gedit:5525): WARNING **: 16:17:08.919: Set document metadata failed: Setting attribute metadata::gedit-position not supported
 
4:18 PM
ignore the output, that's wha t I also get every time I try to start gedit from terminal
 
When I open the file again, it doesn't show my changes.
 
hmm ...
 
Wait.
When I open it with the command from the terminal, it does. It doesn't for double-click in Files.
 
wat
 
And when I run sudo update-grub, it shows me an error.
/usr/sbin/grub-probe: error: failed to get canonical path of `/cow'.
 
4:20 PM
@Hosch250 don't have a cow, man.
(sorry, couldn't resist)
 
4:52 PM
I'm in now. I don't know what I did.
At least, kind of. I can get in, but restarts don't seem to go good. I need to hit Escape as it loads, then type normal into grub.
 
I now have 80 mini ducks printed. Awaiting my arrival of magnets so I can hide them around the office in conspicuous locations.
 
anyone know what is the keyboard shortcut for Insert Copied Cells? I see that it has underline for e but I'm not sure how to get there
 
Hide and conspicuous don't go together.
 
@Hosch250 just like Adam West's Batman.
 
5:09 PM
@this right-click and e would do that but looks like Ctrl+Shift++ (and plus).
 
Lol.
Ok, so I set this, and it still doesn't seem to be working...
 
@this Home tab>Cells group>Insert menu>Insert copied cells. Hover over that and it shows you the hotkey.
Not all hotkeys are listed in the tooltip windows.
 
What version of Excel shows Insert copied cells?
:facepalm: you gotta copy the cells first for that option to show
 
:+1: We've all been there before.
 
It's Friday and a long weekend = me checked out
 
5:12 PM
@IvenBach TBH I didn't even know it had a ribbon item
I only knew of it via the right-click menu
and also never occurred to me that I could alt+e with a open context menu
 
shows you how often I look there
 
Ooooh. I love the hovertext for GoTo.
> What's faster than scrolling? Jumping.
 
I don't know what "The Onion" is...
 
Satire news
#FunFact: in 2000 or so, they wrote an article announcing the new Gilette 5 blade razor. Fast forward to 2010 (not sure when), Gilette did in fact announce such product. :)
 
5:27 PM
@this I really feel like I should write a 'Discover-The-Ribbon' style of articles for Excel.
So many commands in there that are helpful.
 
which kind of implies that the ribbon sucks at discoverability
but yeah, that might be useful for those without a clue
 
It was the same with the menu though.
Granted in 95/98 I wasn't using Excel properly.
Thinking about it though I still don't use it correctly.
 
Does anyone?
Besides Joel Spolsky, I guess.
 
Some things are irking me :joy:
I swear Spotify and Discord automatically reset my password for me.
 
5:44 PM
@Hosch250 well, they're spotty and discordant. What do you expect?
 
> Sounds like you have very specific UI improvements in mind that would take me days to understand and complete (and that's being very generous). So, yes - please go ahead and make any changes you like.
 
For MVVM I want to access an object on the View from the VM. Is that taboo?
 
Yeah.
Pass the data between. If you need to access the UI item directly and it's a UI concern, you can use the code-behind.
As in, you are doing an animation and need to modify the element with C#.
 
I have 2 radio buttons that will control whether an interface will be Public/Private. When either is selected I want it to update the VM accordingly.
Is a command preferable to code-behind for that? Reason being they'll share the same logic.
 
@Vogel612 "git : Depends: liberror-perl but it is not installable"
Any ideas?
I can't get Git installed :(
@IvenBach Use a binding.
That's pure data.
 
6:00 PM
are you still in the liveboot disk?
like in the "try this" phase?
 
No, I'm in my main system.
 
hmm ...
 
I got in by hitting esc at boot, then typing normal into grub.
Then it prompted me for my password. I have to do that every time.
Turning nouveau.modeset=0 on didn't help.
Also, I'm trying to figure out how to find new window managers again.
 
do you have the nvidia drivers installed alongside?
that can cause some problems
 
I haven't manually installed them, no.
 
6:04 PM
hmm ... well, I'm not really used to troubleshooting ubuntu or grub, so... you're kind of on your own there
 
NP. At least I can get in.
 
I assume you did run an apt-get update before trying to install git?
 
I'm running sudo apt-get install git from my terminal root.
No.
Running that now.
 
out of curiosity, what's a grub exactly?
 
bootloader
something between BIOS/UEFI and OS kernel
basically allows you to select an OS if you have multiple installed side-by-side or does the init handling for your solitary OS if you don't.
 
6:06 PM
so you can bring your own bootloader? For some reason I thought it was down to the BIOS/UEFI to allow you to boot into the OSes you may have.
 
you can, yes. There's multiple available.
I'm using refind, grub is another one
 
hmm. Ok. It's been years since I futzed at that level; back then just used whatever was available on the BIOS
 
@IvenBach Set the GroupName on the radio button group so they auto-sync, and bind to the IsChecked property. The value passed will be whatever you set in the Content property.
Hmm, there's a grub update. That can't be good :/
:P
Updating alt-get is installing that and a bunch of OS/app updates.
Restart time!
 
Re: my earlier question about dynamic/static resources - it looks like we have 39 instances of ="{DynamicResource {x:Static SystemColors...}}". I will change into ="{StaticResource SystemColors....}"
unless there is any exceptional reason I might not know about?
 
3 hours ago, by FreeMan
@this reasons... Probably not very good ones, but reasons...
 
6:16 PM
;-)
 
6:32 PM
@this I can't think of one
 
Good. They shall go away then
Also, there is really a lot of hardcoded color values everywhere. :-\
Fortunately they are mostly copy pasta so it's a matter of converting into a key referring to the new style resource dictionary
 
you got the dictionary to work?
 
yep
 
nice!
grabs crystal ball ...I see... a triple-digit negative diff PR in the near future...
 
even tested it live to verify. For now I'm not actually changing the style (I did start out that way but backtracked because I was mucking things up); just unifying them all into a single dictionary that is then merged into other XAML files.
:) IDK how much negative diff there's actually but there has been a fair amount of trimming already.
 
6:44 PM
I'll merge @BZngr's PR right away then, and make a separate PR for the UI changes I have in mind
 
I am not sure whether I should unify the stuff like Style or Setter which are also a part of the resource dictionary.
 
a lot of resources are duplicated all over the place
 
I would need a tool that will tell me whether a section of XML are duplicated or not.
 
you ok with the merge?
that way you'll have all the xaml
 
yes go ahead & merge.
I don't want to assume they are same esp if there's only a small diff in some value in middle of the gigantic Setter / Style elements.
Anyone know of such tool to help with that?
or maybe git can be used for that purpose? I kind of doubt it.
 
none come to mind
@Duga whoo, a 3-digit issue!
 
Too bad - MZ-Tools 8.0 has a mult-line find & replace which might have had worked but I don't have it for VS
only for VBA
 
wouldn't regex work?
 
I don't need regex in this case. I only need to verify whether the element is actually duplicated in other XAML files
and avoiding cutting out those that are merely similar but not identical
yeah, that swas the idea I needed. I may try this
 
7:02 PM
does anyone know what glyph panel is exactly?
i have a color that maps into purple and I'd think I never actually saw it used anywhere in RD
 
@Hosch250 Thanks. I'm good with the grouping, they're within a GroupBox.
My issue is having Public as the default value. If the implementing class is public then PublicRadioButton.Checked = true and the PrivateRadioButton.IsEnabled = false.
However when implementing class is private PrivateRadioButton.IsEnabled = true but neither of the buttons are selected.
 
@Duga FWIW, I listed a few other issues in a prior #875 comment that might also be 'closable' due to #5327.
 
@IvenBach Two-way binding?
 
<StackPanel Orientation="Vertical">
    <RadioButton x:Name="PrivateInstancing"
                    Content="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ExtractInterface_PrivateRadioButton}"
                    IsEnabled="{Binding IsPrivateInterfaceEnabled}" />
    <RadioButton x:Name="PublicInstancing"
                    Content="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ExtractInterface_PublicNotCreatableRadioButton}"
                    IsChecked="{Binding ClassInstancing, Mode=TwoWay, Converter={StaticResource ClassInstancingToBool}}" />
 
7:08 PM
From what I can tell it's the binding I have set up for the public radio button.
 
No.
Go read that article I linked.
 
[rubberduck-vba/Rubberduck] build for commit 5d7369a3 on next: 61.69% (target 0%)
 
Dang DNS is still not updated. wtf
Monday was more than 72hrs
I must have done it wrong
 
DNS is hard to get right. BTDT a bit recently.
 
7:14 PM
I wish there was a WPF visual mapper. I think that GlyphPanel refers to the left bar of hte menu where the icons are but I can't be 100% sure.
 
> Create a TXT record in your DNS configuration for _github-challenge-rubberduck-vba.rubberduckvba.com.
 
Could the trailing dot be required??
 
Might that help?
 
[rubberduck-vba/Rubberduck] build for commit 5d7369a3 on next: 70.97% of diff hit (target 60%)
 
7:15 PM
@MathieuGuindon for ACME?
 
@MathieuGuindon Don't think so.
 
The verified domain badge thingy
 
@Hosch250 that came up in the google but that's nothing to do with GlyphPanel
 
I couldn't find anything about glyphpanel.
 
yet it's all over in our xaml files....
and i'm pretty sure I never saw purple anywhere
 
7:17 PM
As far as I can tell it's a custom control. Either ours or something we referenced.
Just 2 matches in the entire repo. Where are you seeing it?
It's the border in the toolbar control.
 
Sorry - you're right - there's several but only in one file Toolbars.xaml
VS says there's 12 references to it
I guess this is where we define it:
<Border x:Name="GlyphPanel" BorderBrush="{StaticResource GlyphPanelBrush}" BorderThickness="1" Background="{StaticResource SoftBackgroundBrush}" Height="20" Margin="0,1" Visibility="Hidden" Width="20">
I don't understand why one'd name a border a panel?
I now see that my assumption was mistaken - I did thought it was some built-in control but in fact it seems to be ours.
 
a border with a background brush is pretty much a panel :)
one without any layout built-in, but still
 
sorry I don't follow. how do you get from a 2d box to a filled-in rectangle?
at least that's what I think of when i think "borders"
 
Background="{StaticResource SoftBackgroundBrush}"
that's all it needs to be a filled-in rectangle
 
Yes I see that but I did natively assumed it'd only color only that line
 
7:26 PM
and with width=20 you can make it have cornerradius=10 and end up with a circle :)
 
so... Border are in fact rectangles that has transparent background, giving an appaerance of being a border?
that feels... confusing.
 
pretty much, yeah
 
Or put a different way, why not use Panel instead of Border
at least it'll make sense... right?
 
something something visual tree complexity something
 
@Hosch250 Read the words. Didn't understand the content. I Don't understand WPF and MVVM well enough to extract what it's trying to convey..
 
7:28 PM
a border is pretty lightweight IIUC
 
please explain to me again why WPF is great....
 
A border is a decorator.
A panel has a border, if you can set the border properties.
A border is lighter weight. It's basically "draw a few lines and don't do anything else."
And yeah, that probably shouldn't be a border.
 
I see. so actually a Rectangle at lesat
which would make it more clearer that it's meant to be some kind of background a la a panel... right?
 
a panel has a children collection I think
a border can only have 1 child element
 
See - the fact that I'm confused tells me that it's not very clearly defined. And the fact that it says "GlyphPanel" kind of distracts me from all that.
This all started because I'm trying to name the glyph panel's border (?!?) when it's highlighted:
                <Trigger Property="IsHighlighted" Value="True">
                    <Setter Property="BorderBrush" TargetName="Border" Value="{StaticResource GlyphPanelBrush}"/>
                    <Setter Property="Background" TargetName="Border" Value="{StaticResource ToolBarButtonHover}"/>
                    <Setter Property="BorderBrush" TargetName="GlyphPanel" Value="#90006CD9"/>
                    <Setter Property="Background" TargetName="GlyphPanel" Value="{StaticResource ToolBarSubMenuBackground}"/>
 
7:32 PM
@IvenBach Check the indenter settings. That has some checkboxes you can look at.
 
Note the the hard-coded color value. That's the color I need to name. I guess I'll just call it GlyphPanelHighlighted.
But as you see, it's kind of confusing that we're setting both the Border and GlyphPanel - that's why it didn't register in my mind that GlyphPanel is in fact itself another Border.
Ah, yes I also remember - I was trying to figure out why I had ToolBarSubMenuBackground for GlyphPanel's background.
because it originally used the same color code which got replaced into ToolbarSubMenuBackground
I was going to call it ToolBarSubMenuBorder originally, I think.
 
.5296 installed. .5293 never used.
 
but the first Setter is using GlyphPanel FML.
That's why the names don't really match up and I'm trying to make sense of it.
 
where's glyphpanel being used anyway?
 
in Toolbars.xaml Not sure exactly where.
I think it's the left side of the menu where we have icons but ?
 
8:37 PM
Is there any reason to implement an interface which has no members? I saw that in the RD code base. Also while getting the public extract interface working I've wondered this several times.
 
I think that was done to provide an identity
 
Identity? A placeholder for future use?
 
No, more like I'm A but also B
so we can sift the A-onlyers from A-and-B-ers.
I don't think we can do that in VBA meaningfully, so not sure there'd be a reason to have an empty interface in VBA, unless someone can provide a reason.
Because the whole identity thing implies you can reflect on it --- like use it in DI/IoC. But we can't reason about that in VBA.
 
Foo_Bar without an implements keyword and/or interface annotation feels like it should be an ImplementsKeywordMissingInspection
 
@IvenBach that's called a "marker interface", and it's a design smell :)
 
8:50 PM
it is but I seeem to recall there was a reason.
welp, all design smells have "reasons"
 
hm, the inspections list is broken
I accounted for new inspections being in [next] and not in [master], but not for inspections being in [next] but not in [master]
> 26. FunctionReturnValueDiscarded Pre-Release: this inspection is only available in pre-release builds.
Warns when a user function's return value is not used at a call site.
needs some CSS love
 
I'm kind of impressed with myself ATM :P I'm sudoing around like a pro.
Moving all my documents over now. Except for the ones that only work on Windows.
 
@MathieuGuindon This shows how much catching up I need to do. At least I'm coming up with these ideas as I see them. Progress of any kind is good.
 

« first day (2051 days earlier)      last day (134 days later) »