« first day (1847 days earlier)      last day (26 days later) » 

12:00 AM
[rubberduck-vba/Rubberduck] 3 opened issues. 15 issue comments.
[Minesweeper] Games Played: 101, Bombs Used: 70, Moves Performed: 14861, New Users: 14
6 hours later…
5:51 AM
@IvenBach What did you force push there?
3 hours later…
8:59 AM
> **Justification**
When working on a large project and when creating, removing or renaming modules, this process is greatly slowed down as Rubberduck automatically does a refresh after each of these actions - I may need to wait for up to a minute after each one before being able to do anything else in the VBE.

Having an option to pause Rubberduck - so that when it needs to do a refresh, rather than doing the refresh it goes back to "pending" - for the user to manually intit
> Do note that we're not doing these refreshes willy nilly. If you use Rubberduck tools on a project where the state that Rubberduck knows and the VBE internal state have diverged, the results may be destructive.

What I mean by that is:
If Rubberduck is out of sync, especially refactorings and quickfixes can inadvertently delete code and/or make it uncompilable or nonsensical.

Rubberduck only parses modules that have changed, but we need to recompute and reresolve references between mod
1 hour later…
10:14 AM
10:52 AM
> Hmm, not sure... I definitely think Add/Import is too noisy. As for the Existing {?}, here's how it looks in VB6:


I think *module* would be counter-productive there. Torn between *file* and *item* though...
11:11 AM
> Incidentally, Import was never available to VB6, the word Import didn't really fit, so the functionality was missed. Now that it's Add, I'm adding it.
12:03 PM
> @Vogel612 If I use the CE to add a new, blank module, and RD only parses modules that have change, then the parse should be nearly instant - it should only parse a new, blank module with no code and possibly a @Folder("xyz") annotation, and that shouldn't take long, nor should it take long to update the CE. Additionally, resolving references shouldn't be necessary because there should be no references to this new, empty module, and since it's empty there should be no references from it
@Duga @mansellan just one UX opinion. Throwing it out as a thought. Won't cry or quit if no changes are made. Very happy you're adding the functionality, no matter what it's called!
12:21 PM
Is this a reasonably small bit of code for a property? It seems OK to me, but it seems that possibly the If true bits could be called out into separate functions, but then that seems totally overkill for one line...
@Duga do we know the difference between adding a new module vs. adding an existing module, though? I don't think it's using different events or flagged as such
@FreeMan lol ok. I'll go with whatever, let's see if anyone else has a view
Private Function HasAwardBeenEarned(ByVal item As ClinicItem, ByVal satScore As Double, ByVal reportSettings As SatAndLoyaltySettings) As String

  Dim earned As Boolean
  If item.generateSatSurvey And item.generateNPS Then
    earned = item.YtdNPSRatio >= reportSettings.NPSGreenCutoff And satScore >= reportSettings.satGreenCutoff
  ElseIf item.generateNPS Then
    earned = item.YtdNPSRatio >= reportSettings.NPSGreenCutoff
  ElseIf item.generateSatSurvey Then
    earned = satScore >= reportSettings.satGreenCutoff
12:52 PM
FWIW, the code above isn't DRY
and because it's not dry, it means more parsing time to realize that you're actually using the same formulas
Separating the formulas item.YtdNPSRatio >= reportSettings.NPSGreenCutoff and satScore >= reportSettings.satGreenCutoff into a one-line function would make it more obvious that you're just checking both when the item has both generateSatSurvey and generateNPS, otherwise, one of either that applies.
It's really a nitpick, though.
more like this:
Private Function HasAwardBeenEarned(ByVal item As ClinicItem, ByVal satScore As Double, ByVal reportSettings As SatAndLoyaltySettings) As String

  Dim earned As Boolean
  If item.generateSatSurvey And item.generateNPS Then
    earned = DoesNPSQualify(item.YtdNPSRatio, reportSettings.NPSGreenCutoff) And DoesSatQualify(satScore, reportSettings.satGreenCutoff)
  ElseIf item.generateNPS Then
    earned = DoesNPSQualify(item.YtdNPSRatio, reportSettings.NPSGreenCutoff)
  ElseIf item.generateSatSurvey Then
now the fun part. This isn't actually part of the class but it should be. I'm not sure where to put it, though.
I have ClinicList.cls that contains a collection of ClinicItems.cls
the satScore that's received is a property of ClinicList, while item is one of the many ClinicItems in the collection.
I think that this property needs to be on ClinicList, since at that point it will have access to the ClinicList.SatsifactionScore plus ClinicList.ClinicItems(index). Is that the correct logic?
As I type out loud, that's the only logical place. It can't be ClinicList.ClinicItems(index).HasAwardBeenEarned because it (ClinicItems(index)) wouldn't know anything about ClinicList.SatisfactionScore.
1:11 PM
I don't have enough context to say for sure -- I'm wondering if you are perhaps calculating scores across all items in a list or something like that.
If that's the process, then a separate class that's responsible for calculating everything might make more sense, especially if you need the resulting data for further work downstream.
That's probably because my naming sucks.
Who's naming doesn't suck?
I'm looking at this class and its sub-class collection now and wondering where the heck I came up with the names for some of this stuff
thanks for the little pat on the back, @FreezePhoenix. :thumbsup:
1:30 PM
FreeMan, the sign of a good programmer is comments where they are needed.
The sign of an expert programmer is when you can remove the comments and not know the language nor the libraries they are using and still know what is going on.
> I agree. I think a RD turn on/off button would be handy with large projects.
1:48 PM
@Duga the rabbit hole is getting deep and the natives are getting restless...
1:58 PM
Five clicks vs a button. The Five clicks are Add-Ins>AddIn Manager>RubberDuck>Unload>Ok
I've successfully migrated my code from the random place where I initially wrote it to its proper place as a method of its class. #yayme
However, I've noticed something odd when debugging.
Here's the method's code:
Public Function AwardEarnedStatus(ByVal clinic As String, ByVal npsEarnedScore As Double, ByVal satEarnedScore As Double) As String

  Dim item As ClinicItem
  Set item = ClinicItems(clinic)

  Dim earned As Boolean
  If item.generateNPS And item.generateSatSurvey Then
    earned = DoesNPSQualify(item.YtdNPSRatio, npsEarnedScore) And DoesSatQualify(YtdClinicSatScore(item.Name), satEarnedScore)
  ElseIf item.generateNPS Then
    earned = DoesNPSQualify(item.YtdNPSRatio, npsEarnedScore)
  ElseIf item.generateSatSurvey Then
here's the oddity in the Locals window:
Why is AwardEarnedStatus listed twice in the Locals window?
This is at the end of execution of the method, so one of them has been populated, and the other hasn't.
and it happens here, too:
Private Function DoesNPSQualify(ByVal npsScore As Double, ByVal npsCutoff As Double) As Boolean
  DoesNPSQualify = npsScore >= npsCutoff
End Function
obviously, this is how the VBE displays the function being returned, I'm guessing both as a "local variable" and as the "return variable" (or something along those lines), but why?
2:32 PM
> RD suspends parsing when the IDE isn't in design mode - an interim work-around can be to add/remove modules programmatically, at run-time.
Pond, quick question on WPF... I'm looking at some MVVM code at the moment, and found that the view is subscribing to a bus and raising events for the VM to process when a message arrives.
Does that seem right? Would have thought that the subscription should be in the VM...
but my WPF knowledge is, uh, slim
oh, wait... it's not actually a view. it's just called FooView...
will git commit -a automatically add in untracked files, or will it only stage the currently tracked but not staged files?
ugh... just realized that my poor choice on Fri has all my git pages lost to the ether.
skiwiing instead of bookmarking
1 hour later…
4:01 PM
> Another workaround would be to unload RD from the menu via Add-Ins>Add-In Manager...>Load Behavior group>Loaded/Unloaded. Unload the duck, perform your various edits and reload ducky after completing. I've had to do that myself when doing a lot of renaming. However whenever ducky is missing the IDE doesn't feel complete.
@M.Doerner Just the amended commit.
@FreeMan Skiwi it for reading in ` < 2 `hours, elsewise bookmark.
@FreeMan git commit -a will only include tracked files. git-scm.com/docs/git-commit
> Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.
If you want to include everything git commit . will add both tracked and untracked files.
4:21 PM
> >
> Another workaround would be to unload RD from the menu via Add-Ins>Add-In Manager...>Load Behavior group>Loaded/Unloaded. Unload the duck, perform your various edits and reload ducky after completing. I've had to do that myself when doing a lot of renaming. However whenever ducky is missing the IDE doesn't feel complete.

Is it OK to do this now? - I'd been avoiding doing this because of dire warnings about unloading/loading Rubberduck in the past.
@Duga I think so. I just did it and ducky didn't barf.
Can any others with more knowledge confirm?
it's been fixed for a while AFAICT
> I tried it with a project and didn't have any issue. We, those of us at the pond, are pretty sure it's been fixed for a while.
Odd how I'm now answering questions for others at the pond and informing our end users. How'd this come about?
Failing. Gaining experience. Failing. Failing. More failing. Tiny success. Perseverance.
> @neilt1700 AFAICT it's been fixed a little while ago, but since we know for a fact that some of the objects are still leaking (mostly parser state stuff IIRC), we haven't gone all-out on green-lighting unload+reload; it should work just fine, but I'd still recommend saving.
> @neilt1700 AFAICT it's been fixed a little while ago, but since we know for a fact that some of the objects are still leaking (mostly parser state stuff IIRC), we haven't gone all-out on green-lighting unload+reload; it *should* work just fine, but I'd still recommend saving.

Back when the "dire warnings" were made, unloading+reloading RD would downright corrupt the entire VBE and its host process, wasn't pretty. We've come a long way!
4:34 PM
so i'm coming up against an anti-pattern I'm mentally describing "Oddly Specific Generics". That is, generics which, although they're not switching on type, still have way too much domain smell attached and should be abstracted further.
does that make sense, and has anyone else seen it?
> Well I'd always save... I'd be really happy with unloading/reloading for the odd occasion when I am getting a lot of refreshes.
@Duga is reloading solid now?
oh wait, just re-read properly. ignore me.
5:19 PM
@IvenBach thanks for enabling my lazy!
@IvenBach Succeeds at life
$ git push
Enumerating objects: 66, done.
Counting objects: 100% (66/66), done.
Delta compression using up to 4 threads
Compressing objects: 100% (38/38), done.
Writing objects: 100% (38/38), 6.63 KiB | 323.00 KiB/s, done.
Total 38 (delta 34), reused 0 (delta 0)
To file://F:/SHARE/rest/of/path
Is there anything worth knowing out of that output, or is it just status updates for projects significantly larger that what I'm working with
That's more of a Vogel question.
I asked it as a general question.
5:42 PM
@FreeMan Basically just status updates.
It probably is also highly useful for the git devs when they break things to see where it goes wrong.
that's what I was thinking. If I had hundreds of modules, I could see that being useful. With my small collection, mostly it's "poof!" and all the lines show up...
6:04 PM
@mansellan depends. Are you saying a type constraint e.g. where T : ISomething is an anti-pattern?
6:37 PM
no, it's difficult to explain... Imagine MyAppFooItemView<TKey, TItemKey, TMessage, TItemMessage> when actually what's really being expressed is ReadThroughCache<TKey, TValue>
sort of "I added some generic type params not because the generic really needs them, but because I wanted them for my particular use-case and didn't abstract fully enough"
1 hour later…
7:52 PM
would anyone else agree that XML injection is only dangerous if there's an application logic that relies on the contents of the XML but otherwise is meaningless in cases where XML documents are purely data?
so having your config stored in XML == bad
that's a separate thing.
I dont really use XML for anything
so thats one way to avoid XML injection :P
If you do anything with the XML, injection can be harmful, e.g. if you just render it or deserialize it into an object.
7:58 PM
all the examples of XML injections (sparse they were) relates to SOAP, which implies there's an application that's executing actions based on the content of the XML
If it ends up as a POCO, all you get is crappy data in fields but not actually alteration of the application behavior, a la SQL injection, no?
If you really just store it, I do not think it can be harmful. However, as soon as you process it, you have to be careful.
Depending on your deserialization method, you can get interesting results.
Especially, if obscure XML features are involved.
My typical use for XML is usually transformed into a relational table in SQL
e.g. SELECT x.value(N'@foo', N'int') AS x FROM @xml.nodes('/t/r/') AS t(x);
Note that most known XML attacks can be disabled by disabling features like type hints and XML entities and stuff.
since they all end up as data in fields, I can't imagine how XML injection would apply
The .NET XML parser is pretty safe, from what I've heard.
8:04 PM
but my lack of imagination does not make it impossible.
The other way it can be attacked is through ctors with side effects.
These can be combined to, for example, use XML entities to write a file to the disk.
That requires some deep knowledge about the source code, no?
Then they use a type hint to call the Process constructor with a specific program and that file as a parameter.
The Process constructor fires up a new program.
Alternately, XML is powerful enough to call members on the type that gets created.
JSON has this stuff too, except the external entities.
@Hosch250 or... not using XML ;-)
The solution is the same in both cases--disable these features as much as possible (the default .NET versions of both parsers do this in the latest versions) and only let it create certain types (e.g. by telling the deserializer what type to deserialize it to yourself, instead of letting it guess).
@mansellan JSON has nearly as many attacks as XML.
8:10 PM
Would you say that the vulnerability would be actually with the XML parser, not the application's logic?
I'm actually demoing these at work next week.
@this Correct.
That's why they recommend you don't write your own parser anymore either.
right - so in my example earlier, whatever parser the SQL Server uses, might be tricked into doing something stupid
I am 99% sure it's using the same .NET parser, though.
And the .NET versions are safe by default (according to the head of OWASP Norway), but the Java ones are not.
@this I'm sure that the SQL Server team would be on it super fast. That's probably the most secure XML parser in the world.
lol, considering that Java was the one that led the XML madness back in 90s
@Hosch250 Ofc - the clue's in the first two letters :-)
8:17 PM
> Closes #5008.

Also adds the ability to import file(s) to VB6.
@Duga it's been a while...
8:43 PM
[rubberduck-vba/Rubberduck] build for commit a6971823 on unknown branch: AppVeyor build failed
@Duga huh, ISS fail. doesn't look to be me?
it's the same error Iven was trying to work around.
ah ok
either the files is actually not there, (even though it should be there since it's in git repo... apparently?) or something.
so... next is emborkened atm?
for AV I mean
8:51 PM
not sure
hmm it's using 5.5.9
Q: WizardImageFile does not work in Inno Setup 5.5.8

MaverickI installed the latest version of Inno Setup v5.5.8 (a) and now I can not view the WizardImageFile bitmap file in my installation wizard. It worked just fine in a the previous version. Am I doing something wrong or its a bug? Here a script example I created with the help of the Inno Setup wizard ...

sorry i actually meant this: stackoverflow.com/questions/22233205/…
which basically says to use absolute path.
which is already the case. :joy:
hold on... .Iven had a successful build
ah I see, he only included one image.
could it be something absolutely moronic as having spaces after each comma?
(which begs the question why it was working up to now)
> # [Codecov](https://codecov.io/gh/rubberduck-vba/Rubberduck/pull/5024?src=pr&el=h1) Report
> Merging [#5024](https://codecov.io/gh/rubberduck-vba/Rubberduck/pull/5024?src=pr&el=desc) into [next](https://codecov.io/gh/rubberduck-vba/Rubberduck/commit/4f387a27228c881a76258dce1aba8f35c73ed847?src=pr&el=desc) will **increase** coverage by `<.01%`.
> The diff coverage is `n/a`.

@@ Coverage Diff @@
## next #5024 +/- ##
here we go. Inno Setup's moronicity will be shortly exposed or not.
9:34 PM
[rubberduck-vba/Rubberduck] build for commit 87ed3ee4 on unknown branch: AppVeyor build failed
hmm. ok, it's not space, which would have been moronic.
did a recent merge break it?
IDK; Iven's PR did build yesterday when it only had one file
I opened the second PR to edit the .iss file to see about resolving it.
9:41 PM
you mean #5024?
or some other PR?
Yeah. PR5024 was to edit the file and see if it would resolve it.
you can see that it did built yesterday
when you only had one file
PR4986 was what alerted me to the issue.
I'm not sure which PR actually introduced the issue though.
> # [Codecov](https://codecov.io/gh/rubberduck-vba/Rubberduck/pull/5024?src=pr&el=h1) Report
> Merging [#5024](https://codecov.io/gh/rubberduck-vba/Rubberduck/pull/5024?src=pr&el=desc) into [next](https://codecov.io/gh/rubberduck-vba/Rubberduck/commit/4f387a27228c881a76258dce1aba8f35c73ed847?src=pr&el=desc) will **increase** coverage by `<.01%`.
> The diff coverage is `n/a`.

@@ Coverage Diff @@
## next #5024 +/- ##
[rubberduck-vba/Rubberduck] build for commit 87ed3ee4 on unknown branch: 64.23% (target 0%)
I'm not sure it was a PR that introduced the issue - the .iss file hasn't been changed for a long time
more likely something borked in Inno Setup version or something
9:45 PM
Was Inno Setup recently updated?
I'm still nebulous as to what it actually is.
not sure but I note that AV is using 5.5.9
huh. I'm using 5.6.1....
wtf? chocolately is using 6.0.2?
why aren't you getting 6.0.2, then, chocolately?
10:10 PM
[rubberduck-vba/Rubberduck] build for commit 360b3fbd on unknown branch: AppVeyor build failed
prior, we had this: Error: The system cannot find the path specified.
now the latest failure is Error: The filename, directory name, or volume label syntax is incorrect.
10:31 PM
> I do wonder though if Add, Export and Remove should be in one group, separately from Add and Indent?
> I do wonder though if Add, Export and Remove should be in one group, separately from Find and Indent?
> Awaiting UX feedback on #5008, don't merge yet!
[rubberduck-vba/Rubberduck] build for commit 595f1ef6 on unknown branch: AppVeyor build failed
10:47 PM
This trivial update quickly became a rabbit hole of learning.
@IvenBach They normally do... Triviality is inversely directly proportional to complexity IRL...
I grossly underestimated adding these toggle buttons for filtering.
> What do you mean it takes 3 months to add a single button?!
@IvenBach Hmm.. seems trivial... runs away
For your level of skill it probably is trivial. My skill level, not so much.
c.f. "can you just...?"
10:51 PM
But it is manageable.
No no, I meant. It sounds trivial, so it'll be a nightmare I want nothing to do with!
c.f. means what?
@IvenBach IIUC, "for evidence, see..."
The abbreviation cf. (short for the Latin: confer/conferatur, both meaning "compare") is used in writing to refer the reader to other material to make a comparison with the topic being discussed. It is used to form a contrast, for example: "Abbott (2010) found supportive results in her memory experiment, unlike those of previous work (cf. Zeller & Williams, 2007)." It is recommended that cf. be used only to suggest a comparison, and the word see be used to point to a source of information. == Biological use == In biological naming conventions, cf. is commonly placed between the genus name and the...
uh, c.f. seemed trivial ;-)
huh, #TIL c.f. doesn't mean what I thought it did
Never assume anything with me and #Words. Spoonfeeding is my norm.
I like being wrong. It means I'm (slightly?) more likely to be right next time.
I learned a long time ago to cherish failure.
10:58 PM
^ especially when it doesn't have a financial or emotional component.
"Every failure guides you towards success". I should write a self-help book :-)
TestOutcomeToTestExprorerOutcomeFilterConverter #NamingIsHard
@IvenBach uh, yeah... wherever possible, learn from other people's failure :-)
May 11 '18 at 17:18, by IvenBach
You're smart if you learn from your own mistakes. A genius if you learn from the mistakes of others.
^ thankfully, it's much easier in 2019
yay internets :-)
TBF, WPF does tend to make complex things easy, at the expense of making easy things complex. It needs to be killed with fire imho...
11:06 PM
Simplexity (making things simple through complex underlying stuff - good) vs Complicity (making things unnecessarily complex through simple means - bad {also illegal usually}).
heh, at work I fight for the former given code of the latter...
"Complexity cost" is the single biggest project-killer in existence
I've a ways to go to fully understand that. Getting there.
When you see a sprawling, impenetrable swamp of a codebase, it's normally the result of a history of "meh, that'll do" copy-and-paste mediocrity. It takes care and thought to factor code down, to eliminate redundancy, and to clearly express the problem. Projects and companies that tolerate "meh" fail, sooner or later.
IME It's from non-coders that didn't know any better.
Both are lamentable.
Coders can be guilty of it too, some of them are just lazy.
They know better, but just don't care.
I can't work like that
11:14 PM
^^ That right there is sloth.
Yep, but it happens
Stupidity can be overcome by educating a person.
I've yet to find out how to overcome slothfulness.
Lazy is Good.
Lazy is Efficient.
Lazy is building a tool to make it easier.
Lazy takes a lot of hard work to achieve.
Lazy<T> is on-demand :-)
11:17 PM
I now understand that. Well played.
11:49 PM
:happy-face: figuring this out.
This is why we have PRs, and why PRs are good. They not only educate, they keep out the "here's some codez, it's crap but it solves my immediate problem" syndrome. With good maintainers, that gets commented, and if the comments go unheeded, rejected.
Applies to both OSS and commercial, which is why I'm championing it at work.
I don't understand why a PR style of wasn't done decades ago. Likely because nobody else ever thought to do so?
I think it's a cultural thing... we're unregulated, so there's plenty of money to be made in pretending it's special-voodoo-magic. Peer review blows that apart, makes it transparent.
You work in the healthcare field?
Heh, finance.
Sorta, working for a gambling outfit atm, but it's all just markets...
11:55 PM
Lots of Excel spreadsheets?
Not fussed about divulging that, with my handle I'm sure I could be doxxed very easily from LinkedIn if I ever said something internet-stupid
@IvenBach Actually no, all microservices and R.
The only Excels I see are those I create myself to keep track of it all!
I've had my share of fun with Excel (/Access) VBA in the past though

« first day (1847 days earlier)      last day (26 days later) »