Skip to content

Latest commit

 

History

History
1224 lines (827 loc) · 47 KB

2020-11-01.md

File metadata and controls

1224 lines (827 loc) · 47 KB

< 2020-11-01 >

2,013,312 events, 1,161,701 push events, 1,626,830 commit messages, 101,011,727 characters

Sunday 2020-11-01 02:41:08 by Loorey

Merge pull request #179 from Lamasmaster/I-am-actually-stupid-oh-god-oh-fuck

3AM pr go brr


Sunday 2020-11-01 04:50:03 by Maria Fe

<style> img { height: 250px; width: 250px; border-image: url(images3.png); } #b { border: dashed gainsboro 5px; display: block; margin-left: auto; margin-right: auto; width: 250px; border: dashed whitesmoke 5px; } #a { border-image: url(images.png); } h { font-size: 50px; color: green; font-family: georgia; text-shadow: 18px 17px 15px red; } </style>

HAPPY 9TH MONTHSARY OF STAYING IN MY LIFE

Distance cannot keep us apart anymore us because our hearts are bonded in a heavenly relation.
Many more months will go like this one but our love will only be stronger day by day!
Nothing can make me realize that you are not with me, that you are so far away from me.
Because, whenever I close my eyes, I can feel you right beside me. Happy Monthsary!

Time will fly, people will change and colors of life will disappear. But one thing will remain constant.
That is My Love for You! Happy monthsary Slark (A.K.A Maria Fe Juit!) Come back soon and give me a hug!






💖HERE IS OUR PICTURE TOGETHER:💖


FACT:Your winning face makes my heart melt😊💖




I'M FLEXIN YOUR PICTURES COZ I'M PROUD OF IT! <style> img {
            height: 250px;
            width: 250px;
            border-image: url(images3.png);
        }
        #b {
            border: dashed gainsboro 5px;
            display: block;
            margin-left: auto;
            margin-right: auto;
            width: 250px;
            border: dashed whitesmoke 5px;
        }  
        #a {
            border-image: url(images.png);
        }
        h {
            font-size: 50px;
            color: green;
            font-family: georgia;
            text-shadow: 18px 17px 15px red;
        }
    </style>
</head>
<h1><u>HAPPY 9TH MONTHSARY OF STAYING IN MY LIFE</u></h1>

<body>
    <div class="box">
        <p class="font-set" id="border-img">
           <del>Distance</del> cannot keep us apart anymore us because our <span class="s"> hearts are bonded in a heavenly relation.</span><br>
            Many more months will go like this one but our love will only be stronger day by day!<br>
            Nothing can make me realize that you are not with me, that you are so far away from me.<br>
            Because, whenever I close my eyes, I can feel you right beside me. Happy Monthsary!<br>
            <br>
            <sup>Time will fly</sup>,<span class="a"> <em>people will change and colors of life will disappear</em></span>. But one thing will remain constant.<br>
            That is <span class="r">My Love for You!</span> Happy monthsary Slark (A.K.A Maria Fe Juit!) Come back soon and give me a hug!<br>
        </p>
    </div>
    <br><br><br><br>
    <hr>
    <h2>💖HERE IS OUR PICTURE TOGETHER:💖</h2>
    <div id="b">
        <img src="slark.jpg"/>
        <img src="slark1.jpg"/>
        <img src="slark2.jpg"/>
        <img src="slark3.jpg"/>
        <img src="slark4.jpg"/>
        <img src="slark5.jpg"/>
    </div>
    <hr>
    <h3>FACT:<strong><em>Your winning face makes my heart melt</em></strong>😊💖</h3>
    <div id="a">
        <img src="solo1.jpg"/>
        <img src="solo2.jpg"/>
        <img src="solo5.jpg"/>
        <img 2 src="solo3.jpg"/>
        <img src="solo4.jpg"/>
    </div>
    <hr><br><br>

    <h><center>I'M FLEXIN YOUR PICTURES COZ I'M PROUD OF IT!</center></h>
</body>

Sunday 2020-11-01 05:50:09 by FredLeslie80

Create submitting-content-removal-requests.md

http://open-source-parsers.github.io/jsoncpp-docs/ makes my personal account data and everything in devices go through shares setup by other organizations.Please help me figure out all of this thank you.God Bless your all


Sunday 2020-11-01 06:29:57 by Samuzero15

Hotfix 4 + A Greedsphere

-) (30 - 31 / 10 / 2020) +) Hidden on the game, only spawnable with summon command, but... Meet the greedsphere! // x2 Credits for 15 seconds! (30 with the Player Up. Powerup Upgrade) *) Fixed up the spawning tids for the SF maps, that should set the monsters correctly. *) Just to add a little bit of softness for the SF02 map. Archons of hell and Dark Dogs(New!) will come to cause some grief! // Not a big fan of the difficulty spike when the cyberdemons come. *) Now the damage hud, can be streched depending on the aspect ratio! *) Now, the batteries should'nt be revived by the archviles. +) Added the cvars: sfp_minrecap (Minimum monsters before recapturing) and sfp_monstercap (Max monsters)

-) (28 - 29 / 10 / 2020) *) Re-factorized the inventoy item's decorate. Less code, more read. +) Added the fp_puhud.acs, showing you the current powerups you got in your blood! *) Now, when going no-hud, the old hud will not be shown.


Sunday 2020-11-01 06:41:10 by Misa

Fix crewmates being drawn behind other entities

This fixes the draw order by drawing all other entities first, before then drawing all humanoids[1] after, including the player afterwards.

This is actually a regression fix from #191. When I was testing this, I was thinking about where get a crewmate in front of another entity in the main game, other than the checkpoints in Intermission 1. And then I thought about the teleporters, because I remember the pre-Deep Space cutscene in Dimension Open looking funny because Vita ended up being behind the teleporter. (Actually, a lot of the cutscenes of Dimension Open look funny because of crewmates standing behind terminals.)

So then I tried to get crewmates in front of teleporters. It actually turns out that you can't do it for most of them... except for Verdigris. And then that's what I realized why there was an oddity in WarpClass.cpp when I was removing the active system from the game - for some reason, the game put a hole in obj.entities between the teleporter and the player when loading the room Murdering Twinmaker. In a violation of Chesterton's Fence (the principle that you should understand something before removing it), I shrugged it off and decided "there's no way to support having holes with my new system, and having holes is probably bad anyway, so I'm going to remove this and move on". The fact that there wasn't any comments clarifying the mysterious code didn't help (but, this was 2.2 code after all; have you seen 2.2 code?!).

And it turns out that this maneuver was done so Verdigris would fill that hole when he got created, and Verdigris being first before the teleporter would mean he would be drawn in front of the teleporter, instead of being behind it. So ever since b1b1474b7bbc3ceddea24f689a7ddb050cfe4490 got merged, there has actually been a regression from 2.2 where Verdigris got drawn behind the teleporter in Murdering Twinmaker, instead of properly being in front of it like in 2.2 and previous.

This patch fixes that regression, but it actually properly fixes it instead of hacking around with the active system.

Closes #426.

[1]: I'm going to go on a rant here, so hear me out. It's not explicitly stated that the characters in VVVVVV are human. So, given this information, what do we call them? Well, the VVVVVV community (at least the custom levels one, I don't think the speedrunning community does this or is preoccupied with lore in the first place) decided to call them "villis", because of the roomname "The Villi People" - which is only one blunder in a series of awful headcanons based off of the assumption that the intent of Bennett Foddy (who named the roomnames) was to decree some sort of lore to the game. Another one being "Verdigris can't flip" because of "Green Dudes Can't Flip". Then an OC (original character) got named based off of "The Voon Show" too. And so on and so forth.


Sunday 2020-11-01 07:36:48 by Mohammad Amin Sameti

init

Use scss for customization

Some progress!

Merge multiple scss into main.scss

Generate source-maps

Add acid to index brand-search

Lint some files & update styles

Don't have space before named functions

Add acid to layout on index

Darken the acid

'Modern' buttons for language switching

Add fontawesome

Add night mode button (decorative for now

Make acid faster & use normal distribution

Add categories section to index

Common file for categories and SearchBox component

Actively match acid size to hero

Fix categories overflow & carousel RTL

Larger carousel

Replace SearchBox with b-input

Make initial demo ready

Add PCB to acid (yes, not the reverse)

Make acid a seperate component

Make demo deployment easier AF

Switch to premade palette

Space out index brand letters

Do not crash on missing element

Add blur to acid

Replace en digits with fa

Fix mistakenly commented out nuxt on demo.sh

Move categories spacing from margin to padding

Remove acid blur

Add about page

Fix indention and acid overflow

Match acid with new color palette

Add logo

Change pcb to nagative version

Add gradient to navbar

Glassy everyting

Enhance layout spacing

Put all fonts in one place

Add content image background

Remove acid; customer is stupid

Move logo to images directory

Unified root dir permissions

Cover background

Change bg image

Change index

Update footer

Login page

Comment out homepage carousel

Componentify site footer

Add input.svg

Support theme switching

Remove default favicon

Add empty videos page

Almost finalize login page

Animate login form

Ignore design directory

Change background image

Add hvr-bob to login button

Login form border glow effect

Match login checkbox style with others

Dont ruin github storage

Fix checkbox bug on firefox

GC after gh-pages update

Add more glow to login form border, style return button

Update to upsteam gh-pages before syncing

Use backdrop filter instead of stupid hacks

Prevent button rules to interfer with other pages

Move global navbar to separate component

Fix unmoved data.lightThemed during refactor

Add site-header to index page

Add prefix to index css to prevent rule clash

Use different backgrounds for different sections of index

Simple video trickery

Animate index cards

Footer bg & email sub style

Resize footer elements

Change index > header background

Add e-namad and razi img to footer

Fix categories submenu conflict with vitrine header

Add google button to login form

Add avatar image

Change login page background

Stretch index images

Fix firefox mobile login background not playing

Add green overlay to index categories background

Fix categories overflow on mobile

Add worms to footer

Add worms to index-header

Slow down worms

Change worms background

Add index background effect

Increase hunger for cpu on index

Fix digital pipes filter

Move worms logic to separate module

Move pipes logic to separate module

Use source-maps (FF fix)

Do not store a value not needed

Optimize pipes allocations

Free worms from the yoke of the evil circle

Refactor particle as Worm

Refactor Can.move to Worm.move

Dissolve Can.birth

Remove unused variables

Fix worms extinction

Be proud of the avatar you've designed

Add transparency to searchbox

Add lang-switch buttons

Use pipes for login background

Fix index hero icons

Add daily offers link to index categories

Add course image

Remove duplicate css of index page

Disable source map on production

Use embedded svg for searchbox

Reduce image size and add index card bg

Add the fucking social links

Make index vitrin items smaller

Index vitrin details

Add social sharing links to footer

Update packages

Make vitrin a saparete component

login bottun

login Btn

Complate btn login

complate all btn login

google btn complate

Fix stupid margin

Update vitrin course background

Change theme switch icons

Add archives page

Rapair Login Page

Finish Social Network

Fix navbar items on index page

Finish Edit Main Menu

change btn email sender

Remove empty style from DigitalPipes

Lint scss of components

Lint styles with stylelint

Fix linting issues on scss assets

Move social buttons to its own component

Remove unnecessary mixin in SocialButtons

Deploy to gh-pages branch

Make vitrin background larger

Fix social button circle center

Move theme-switch to its component

Add likes to vitrin

Hide navbar-end on mobile

add no-image

Fix linting errors

Incomplete background change

Add Animation To Main Logo

Start Background Header

Finish Social Network

delete background header and footer

Harchy Comment shode baraye logo hast.

Finish Edit Main Menu

unable edit for last child menu

ununable edit color border for logo menu

Add Feather to vitrin

edit vitrin and add new pic

Finish edit button lang , send , login

fix small error in btn index

Edit Last News in Footer

I am Logo...Logo...Logo

Fix a Smal Error

Edit Desighn About Page

Edit No-Picture For Vitrin

Lint all styles

edit vitrin and add new pic

Finish edit button lang , send , login

fix small error in btn index

Create Register

End Edit Desighn Register

Finish All work for Register ... But Responsive

Add Massage in to code ( Add Capcha!)

Add Background And Add Animation To Login

Support linting with autofix

Autofix SCSSes

Lint all SCSS

Add shiny effect to lang switches

Remove all webkit prefixes, automatically generated

Create 404 Page

Move honey comb to separate component

Make vitrin more mobile-friendly

Fix 404 background

Support deployment via Travis

Ignore dekstop.ini files

Fix gone logo

Fix mobile view of lang and theme switches

Fix overgeneralized rules of about page

Switch from b-navbar to custom navbar

Switch to Vuex store for theming

Fix excess faDigits used

Remove excess isIndex property of c/SiteNavbar

Hide avatar on touch devices

Update 404 Page


Sunday 2020-11-01 10:32:46 by Ger Hobbelt

Working on PHASE 1 of the cyclic reference refactor (commit ): added code to the 'end of life' of the application run to:

  • verify that all threads have terminated properly (okay, I just check the SafeThreadPool so there's a bunch out there which are still unguarded, but that should be fine.)
  • verify that all libraries are 'unloaded' properly: we're VERY interested to know whether anyone is keeping illegal references at the end, because the libraries sticking around after this means there's still cyclic dependencies the .NET garbage collector chokes on.
  • monitor the .NET heap at the end right there to observe if it is actually cleaned up the way we'ld expect of a decent application (one without nasty cyclic dependencies)

This is the sort of noise we want to hear at the very end (this example is me quitting the app by clicking the close button during a load of 30+ libraries in various corrupted states -- old backups of mine thanks to Commercial Qiqqa b0rking a giant street pizza several times and which once triggered me into doing a reverse engineer over at: https://github.com/GerHobbelt/qiqqa-revengin (God, was I upset! 20K+ libraries dropping out from under me, just like that!)

Anyway, the good noise your looking for is that 278MByte number dropping like a brick at the very end:

20201101.101627 [Q] INFO  [4] [278.779M] WebLibrariesChanged: Breaking out of UI update due to application termination
20201101.101627 [Q] INFO  [4] [278.787M] -Notifying everyone that web libraries have changed
The thread 0x66a4 has exited with code 0 (0x0).
20201101.101627 [Q] INFO  [Main] [278.647M] UnloadAllLibraries: Heap after forced GC compacting at the end: 278646892
20201101.101627 [Q] INFO  [Main] [278.647M] Making sure all threads have completed or terminated...
20201101.101627 [Q] INFO  [Main] [5.932M] -static Heap after forced GC compacting at the end (in the wait-for-all-threads-to-terminate loop): 5931812 Bytes, 0 tasks active
20201101.101628 [Q] INFO  [Main] [5.932M] Last machine state observation before shutting down the log at the very end of the application run: Heap after forced GC compacting: 5931812 Bytes, 0 tasks active, 14 seconds overtime unused (more than zero for this one is good!)

User benefit: Qiqqa now shuts down promptly and safely during long running multiple library loads (tested with a rig with 30+ very large and corrupted commercial Qiqqa backups, plus extras).


Sunday 2020-11-01 11:53:05 by Charles Karney

Update Mercator projection

Introduction

The existing formulation for the Mercator projection is "satisfactory"; it is reasonably accurate. However for a core projection like Mercator, I think we should strive for full double precision accuracy.

This commit uses cleaner, more accurate, and faster methods for computing the forward and inverse projections. These use the formulation in terms of hyperbolic functions that are manifestly odd in latitude

psi = asinh(tan(phi)) - e * atanh(e  * sin(phi))

(phi = latitude; psi = isometric latitude = Mercator y coordinate). Contrast this with the existing formulation

psi = log(tan(pi/4 - phi/2))
      - e/2 * log((1 + e * sin(phi)) / (1 - e * sin(phi)))

where psi(-phi) isn't exactly equal to -psi(phi) and psi(0) isn't guaranteed to be 0.

Implementation

There's no particular issue implementing the forward projection, just apply the formulas above. The inverse projection is tricky because there's no closed form solution for the inverse. The existing code for the inverse uses an iterative method from Snyder. This is the usual hokey function iteration, and, as usual, the convergence rate is linear (error reduced by a constant factor on each iteration). This is OK (just) for low accuracy work. But nowadays, something with quadratic convergence (e.g., Newton's method, number of correct digits doubles on each iteration) is preferred (and used here). More on this later.

The solution for phi(psi) I use is described in my TM paper and I lifted the specific formulation from GeographicLib's Math::tauf, which uses the same underlying machinery for all conformal projections. It solves for tan(phi) in terms of sinh(psi) which as a near identity mapping is ideal for Newton's method.

For comparison I also look at the approach adopted by Poder + Engsager in their TM paper and implemented in etmerc. This uses trigonometric series (accurate to n^6) to convert phi <-> chi. psi is then given by

psi = asinh(tan(chi))

Accuracy

I tested just the routines for transforming phi <-> psi from merc.cpp and measured the errors (converted to true nm = nanometers) for the forward and inverse mapping. I also included in my analysis the method used by etmerc. This uses a trigonometric series to convert phi <-> chi = atan(sinh(psi)), the conformal latitude.

	forward      inverse
	max  rms     max    rms
old merc    3.60 0.85 2189.47 264.81
  etmerc    1.82 0.38    1.42   0.37
new merc    1.83 0.30    2.12   0.31

1 nm is pretty much the absolute limit for accuracy in double precision (1 nm = 10e6 m / 2^53, approximately), and 5 nm is probably the limit on what you should routinely expect. So the old merc inverse is considerably less accurate that it could be. The old merc forward is OK on accuracy -- except that if does not preserve the parity of the projection.

The accuracy of etmerc is fine (the truncation error of the 6th order series is small compared with the round-off error). However, situation reverses as the flattening is increased. E.g., at f = 1/150, the max error for the inverse projection is 8 nm. etmerc is OK for terrestrial applications, but couldn't be used for Mars.

Timing

Here's what I get with g++ -O3 on various Linux machines with recent versions of g++. As always, you should take these with a grain of salt. You might expect the relative timings to vary by 20% or so when switching between compilers/machines. Times per call in ns = nanoseconds.

           forward inverse
old merc     121      360
  etmerc    4e-6      1.4
new merc      20      346

The new merc method is 6 times faster at the forward projection and modestly faster at the inverse projection (despite being more accurate). The latter result is because it only take 2 iterations of Newton's method to get full accuracy compared with an average of 5 iterations for the old method to get only um accuracy.

A shocking aspect of these timings is how fast etmerc is. Another is that forward etmerc is streaks faster that inverse etmerc (it made be doubt my timing code). Evidently, asinh(tan(chi)) is a lot faster to compute than atan(sinh(psi)). The hesitation about adopting etmerc then comes down to:

  • the likelihood that Mercator may be used for non-terrestrial bodies;

  • the question of whether the timing benefits for the etmerc method would be noticeable in a realistic application;

  • need to duplicate the machinery for evaluating the coefficients for the series and for Clenshaw summation in the current code layout.

Ripple effects

The Mercator routines used the the Snyder method, pj_tsfn and pj_phi2, are used in other projections. These relate phi to t = exp(-psi) (a rather bizarre choice in my book). I've retrofitted these to use the more accurate methods. These do the "right thing" for phi in [-pi/2, pi/2] , t in [0, inf], and e in [0, 1). NANs are properly handled.

Of course, phi = pi/2 in double precision is actually less than pi/2, so cos(pi/2) > 0. So no special handling is needed for pi/2. Even if angles were handled in such a way that 90deg were exactly represented, these routines would still "work", with, e.g., tan(pi/2) -> inf.

(A caution: with long doubles = a 64-bit fraction, we have cos(pi/2) < 0; and now we would need to be careful.)

As a consequence, there no need for error handling in pj_tsfn; the HUGE_VAL return has gone and, of course, HUGE_VAL is a perfectly legal input to tsfn's inverse, phi2, which would return -pi/2. This "error handling" was only needed for e = 1, a case which is filtered out upstream. I will note that bad argument handling is much more natural using NAN instead of HUGE_VAL. See issue #2376

I've renamed the error condition for non-convergence of the inverse projection from "non-convergent inverse phi2" to "non-convergent sinh(psi) to tan(phi)".

Now that pj_tsfn and pj_phi2 now return "better" results, there were some malfunctions in the projections that called them, specifically gstmerc, lcc, and tobmerc.

  • gstmerc invoked pj_tsfn(phi, sinphi, e) with a value of sinphi that wasn't equal to sin(phi). Disaster followed. I fixed this. I also replaced numerous occurrences of "-1.0 * x" by "-x". (Defining a function with arguments phi and sinphi is asking for trouble.)

  • lcc incorrectly thinks that the projection isn't defined for standard latitude = +/- 90d. This happens to be false (it reduces to polar stereographic in this limit). The check was whether tsfn(phi) = 0 (which only tested for the north pole not the south pole). However since tsfn(pi/2) now (correctly) returns a nonzero result, this test fails. I now just test for |phi| = pi/2. This is clearer and catches both poles (I'm assuming that the current implementation will probably fail in these cases).

  • tobmerc similarly thinks that phi close to +/- pi/2 can't be transformed even though psi(pi/2) is only 38. I'm disincline to fight this. However I did tighten up the failure condition (strict equality of |phi| == pi/2).

OTHER STUFF

Testing

builtins.gei: I tightened up the tests for merc (and while I was about it etmerc and tmerc) to reflect full double precision accuracy. My test values are generated with MPFR enabled code and so should be accurate to all digits given. For the record, for GRS80 I use f = 1/298.2572221008827112431628366 in these calculations.

pj_phi2_test: many of the tests were bogus testing irrelevant input parameters, like negative values of exp(-psi), and freezing in the arbitrary behavior of phi2. I've reworked most for the tests to be semi-useful. @schwehr can you review.

Documentation

I've updated merc.rst to outline the calculation of the inverse projection.

phi2.cpp includes detailed notes about applying Newton's method to find tan(phi) in terms of sinh(psi).

Future work

lcc needs some tender loving care. It can easily (and should) be modified to allow stdlat = +/- 90 (reduces to polar stereographic), stdlat = 0 and stdlat_1 + stdlat_2 = 0 (reduces to Mercator). A little more elbow grease will allow the treatment of stdlat_1 close to stdlat_2 using divided differences. (See my implementation of the LambertConformalConic class in GeographicLib.)

All the places where pj_tsfn and pj_phi2 are called need to be reworked to cut out the use of Snyder's t = exp(-psi() variable and instead use sinh(psi).

Maybe include the machinery for series conversions between all auxiliary latitudes as "support functions". Then etmerc could use this (as could mlfn for computing meridional distance). merc could offer the etmerc style projection via chi as an option when the flattening is sufficiently small.


Sunday 2020-11-01 14:46:53 by Marko Grdinić

"9:30am. Got up 15m ago, and am checking out how to remove the XP cap. I want to see what kinds of spells sorcs get. The problem with wizards is that even though they are better, I can't find many of the spells I want to cast.

10:30am. The main problem in my campaign is that I am having trouble getting my hands on all the high level spells I'd want my wizard to cast. But the sorcerer is not a solution to this problem - their selection is just so damn tiny, I'd pick a wizard over a sorc even in this situation.

Their spell selection is just so limited and some of the spells that are really good early on, like sleep for example you'd want to swap for something better. Some like identify are very situational.

10:35am. Since things went like this, I guess I'll skip the morning session. I'll get breakfast while I watch more of those spell videos by Daveorn, do the chores and then get to finishing the package manager. That is the way things should go.

10:40am. I guess you could say that I spent my morning playing, but this is not my usual playstyle.

When I was a kid, the true joy of playing a game like Baldur's Gate was exploration. Right now, I do not care about that at all. Instead I am acting like a real wizard and am playing to master it. I pretty much skipped all of trivial areas and am charging forward. The fun part is abusing your knowledge to challenge areas what would otherwise be beyond my ability. The same goes for enemies. Fighting groups alone is fun.

Yesterday I tried fighting Drizzt, but he is too tough. I want to blast him with spells, but according to the wiki his magic resistance is 98%. I wish I had Lower Resistance, I also see that many spells beside it also lower it, but as I said, I am having difficulty getting my hands on those. So I will recruit Viconia and her cast Magic Resistance which is a divine spell that will set his MR to 18%. That will make him a lot more palatable to deal with.

10:50am. Sure I could get a party of archers and drag him around the map while they kite him, another way kill him is to use the familiar exploit on the wiki, but I do not want to set up a bunch of people together just for this one encounter. Neither do I want to exploit an obvious bug. I want the satisfaction of doing it with my own hands!

12:10pm. I need to start.

1:10pm. Let me start. Wow, it is not like I am even intending to waste time today. It just went by in the blink of an eye.

I need to get some programming done.

My mind is too much in disarray. I am really so far from the ideal programmer that is only focused on the task at hand. But there are some brief times where I live up to that, so let me try to tap into that now.

Forget Baldur's Gate wizard strategies, focus on programming.

I am enjoying life a bit too much lately. I need to get back into the torment.

            v.packages |> List.iter (fun (r,sub) ->
                if cur = sub then // TODO: Should this check be here?
                    circular_nodes.Add(cur) |> ignore
                    errors.Add(r,sprintf "Self references are not allowed.")

Yesterday I did this and ended up wondering where should I do the check.

Well, the check for duplicates, I am going to do in the config parser.

Actually, the duplicate check for files I am going to move outside the config parser, and do it in the validator. I do not want parsing to fail for resumable errors...

        | Success(a,userstate,_) ->
            if userstate.Count > 0 then userstate.ToArray() |> ResumableError |> Result.Error else Result.Ok a

Actually, I am going to return a list of resumable errors along with the schema here. That is the way to improve error handling, but never mind that for now. Let me just get the package manager to work. Then I will clean it up. Once I have that, I'll be able to move to the next part of the pipeline.

1:20pm. Focus me, even now I am still thinking about wizards.

            v.packages |> List.iter (fun (r,sub) ->
                if cur = sub then // TODO: Should this check be here?
                    circular_nodes.Add(cur) |> ignore
                    errors.Add(r,sprintf "Self references are not allowed.")

What I am going to do here is simply this...

            v.packages |> List.iter (fun (r,sub) ->
                if cur = sub then
                    errors.Add(r,sprintf "Self references are not allowed.")

I do not feel comfortable adding it to circularity list.

1:25pm. Yeah, let me just crush this thing today. I will fix it up later. Things do end up being strewn about.

There is so much to think about and it burdens me. In times like that, I should just remember my determination and do it one thing at a time.

1:30pm. Let me get back to testing. This one change should fix the server crashing on self references.

let open' (schemas : Dictionary<_,_>) links loads errors dir text =
    match schemas.TryGetValue(dir) with
    | true, Ok _ -> Job.unit()
    | true, Error _ | false, _ ->
        load !loads text dir >>= fun m ->
        let dirty_nodes, m = validate schemas links m dir
        loads := m
        Array.iterJob (fun dir ->
            match schemas.[dir] with
            | Ok x -> Src.value errors {|uri=spiproj_link dir; errors=Array.append x.schema.errors x.package_errors|}
            | Error _ -> Job.unit()
            ) dirty_nodes

I am noticing that when I add a new project, I need to save it in order to try and have it revalidated.

let change (schemas : Dictionary<_,_>) links loads errors is_open dir text =
    match schemas.TryGetValue(dir) with
    | true, Ok _ when is_open -> Job.unit()
    | _ ->
        schemas.Remove(dir) |> ignore
        load (Map.remove dir !loads) text dir >>= fun m ->
        let dirty_nodes, m = validate schemas links m dir
        loads := m
        Array.iterJob (fun dir ->
            match schemas.[dir] with
            | Ok x -> Src.value errors {|uri=spiproj_link dir; errors=Array.append x.schema.errors x.package_errors|}
            | Error x -> Job.unit()
            ) dirty_nodes

let supervisor fatal_errors errors =
    let req = Src.create()
    let schemas = Dictionary()
    let links = create_mirrored_graph()
    let loads = ref Map.empty
    let change = change schemas links loads errors

    Src.tap req |> consumeJob (function
        | SOpen(dir,text) -> change true dir text
        | SChange(dir,text) -> change false dir text

Let me do it like this.

1:55pm. Focus me. Let me give this a try.

Works perfectly. Now the errors are getting propagated as one would expect.

2pm. Focus...what is next is that I want to deal with project file deletions.

Let me take care of that.

2:10pm.

| ProjectFileDelete x -> Src.value supervisor (SChange(dir x.uri, None)) |> Hopac.start; send_back null

Focus me, focus. Let me try this out. For regular files, I won't do project revalidation as it would be too much work.

2:15pm. Just do this thing, stop thinking about throwing rocks at ogres.

Server bound to: tcp://*:13805
Unhandled exception: System.Collections.Generic.KeyNotFoundException: The given key 'c:\Users\Marko\Source\Repos\The Spiral Language\VS Code Plugin\spiral\subs\f' was not present in the dictionary.

The stupid thing crashed...

let change (schemas : Dictionary<_,_>) links loads errors is_open dir text =
    match schemas.TryGetValue(dir) with
    | true, Ok _ when is_open -> Job.unit()
    | _ ->
        schemas.Remove(dir) |> ignore
        load (Map.remove dir !loads) text dir >>= fun m ->
        let dirty_nodes, m = validate schemas links m dir
        loads := m
        Array.iterJob (fun dir ->
            match schemas.[dir] with // <-- The exception happens here.
            | Ok x -> Src.value errors {|uri=spiproj_link dir; errors=Array.append x.schema.errors x.package_errors|}
            | Error x -> Job.unit()
            ) dirty_nodes

2:30pm. Taking a short breather.

I need to figure this out. Damn, how complicated this is.

2:35pm. I've gone through it with a debugger. The problem is definitely in the...

let dirty_nodes, m = validate schemas links m dir

...part.

    schemas.Remove(project_dir) |> ignore
    remove_links links project_dir
    dirty_nodes.Add(project_dir) |> ignore
    loop project_dir

Come to think of it, this does remove and reinsert it.

    let order, circular_nodes = circular_nodes links dirty_nodes
    order |> Array.iter (fun cur ->
        match loads.[cur] with
        | Ok v ->
            let is_circular = circular_nodes.Contains(cur)
            let links = ResizeArray()
            let errors = ResizeArray()
            v.packages |> List.iter (fun (r,sub) ->
                if cur = sub then
                    errors.Add(r,sprintf "Self references are not allowed.")
                elif circular_nodes.Contains(sub) then
                    let rest = if is_circular then " and the current package is a part of that loop." else "."
                    errors.Add(r,sprintf "This package is circular%s" rest)
                else
                    match schemas.[sub] with // Note: This key index might fail if the circularity check is not done first.
                    | Ok x when 0 < x.schema.errors.Length || 0 < x.package_errors.Length -> errors.Add(r,"The package or the chain it is a part of has an error.")
                    | Ok _ -> links.Add(r,spiproj_link sub)
                    | Error x -> errors.Add(r,x)
                )
            schemas.[cur] <- Ok {schema=v; package_links=links.ToArray(); package_errors=errors.ToArray()}
        | Error x ->
            schemas.[cur] <- Error x
        )

    order, cleanup()

And there is no way it should be able to go past this without being added. So that means that cleanup is the culprit again.

2:50pm. Yeah, it is there at the start, but for some reason when the deletion happens, the links are completely empty.

Why is this happening?

The code is so complex that I cannot easily answer this question.

3pm. I am thinking about this wrong. All this time I am wondering why the links aren't there, but at this point, the package that points to f is not even loaded. So it makes complete sense that the graph would be empty.

3:05pm.

        Array.iterJob (fun dir ->
            match schemas.TryGetValue(dir) with
            | true, Ok x -> Src.value errors {|uri=spiproj_link dir; errors=Array.append x.schema.errors x.package_errors|}
            | _ -> Job.unit()
            ) dirty_nodes

This should fix it. And indeed, it is a natural fix.

I actually thought of doing this first, but making changes without understanding why the error occured is dangerous. I never do it.

Let me try running this again.

3:10pm. Things work perfectly now.

As my next trick, I really should take care of duplicate packages.

I'll move circularity checking to that place as well.

3:15pm. Had to take a tiny break. Let me do this.

Right now I am just cleaning up.

    let packages =
        let packages = HashSet()
        let validate_package d (r,x) =
            try // The validator needs the backwards links even for files that are currently missing, but might exist.
                let x = DirectoryInfo(Path.Combine(d,x)).FullName
                if d = x then errors.Add(r,"Self references are not allowed."); None
                elif packages.Add(x) then Some(r, x)
                else errors.Add(r,"Duplicates are not allowed."); None
            with e -> errors.Add(r, e.Message); None

Let me do this.

Ah, no wait. Shit. I did the self reference check wrong.

if project_dir = x then errors.Add(r,"Self references are not allowed."); None

It should not be d here.

3:30pm. Ok, now it works. My masterpiece.

Though it on a very small scale, I think I've now tested everything that I had wanted to.

3:40pm. Getting to this point too a while. I had to write a bit over 300 lines of code to get all the functionality that I'd wanted. There was a lot peeling to do.

3:45pm. Let me commit here.

At this point, I need to ask myself - what is next?"


Sunday 2020-11-01 15:11:45 by Marko Grdinić

"3:50pm. Yeah, I don't think I have anything else I want to do before starting work on the next step.

Let me step away from the screen for half an hour so I can think about it. It is time to move to the next stage. I've dreamed about this for a long time and it will finally be time to do it.

While I am doing this, I will also take the change to go back and make the nominals and prototypes have a package id as a part of their identity. I said that a flat number would not do the trick. It needs to be a package_id, tag pair

I'll leave that for last though.

3:55pm. Since this will be so complex, I am going to stick to my principles strongly and try to not get tangled up in the details. Instead I will loosen up and just focus on what a single function should be doing and not make too many assumptions about anything else.

Ultimately, there are very real limits to how much I can understand about the code I am writing myself. I need to be careful not to cross them, and modularizing and abstracting according to those limits is what is good programming.

let change (schemas : Dictionary<_,_>) links loads errors is_open dir text =
    match schemas.TryGetValue(dir) with
    | true, Ok _ when is_open -> Job.unit()
    | _ ->
        schemas.Remove(dir) |> ignore

Don't need this last line as validate will do that anyway. Let me get rid of it.

let load (m : LoadedSchemas) text project_dir =
    let m = Map.remove project_dir m

Also let me remove the project dir in here.

This is the way to do it.

4:05pm. Let me just run it. I doubt anything will break, but I should not just assume that the changes will stick.

4:10pm. Everything works as expected. I just moved things around a little, but now things are more integruous. I do not have functions whose purpose should not be to do so removing stuff from the dictionaries and maps.

4:10pm. Let me finally step away from the screen for a bit."


Sunday 2020-11-01 15:33:24 by pde-bakk

deque now works although not flawlessly, fuck you mean Djevayo with your dEqUe iSnT thAT hArD...


Sunday 2020-11-01 18:27:59 by Matthew Camp

trying my damn'dest to use Ubuntu.. fuck i hate its package repos so much!


Sunday 2020-11-01 19:06:04 by frick-nedrickson

Oh boy: It's a BIG DUMB REFACTOR

Yeah, I was thinking that it was just about time that I royally screw up the entire history of my git repo by playing a giant dumb game of musical chairs.

Believe it or not, there's actually a few reasons I wanted to rearrange the project files.

First off, it was a matter of distance. I had everything divided into two categories - assets, or scenes. While this was tidy, it meant that the assets were stored in a parallel directory structure to their corresponding scene. So to rapidly switch between the scene and the asset required a lot more movement and navigation than really made sense. That's the first adjustment we made - grouping together scenes with their assets. Now this isn't perfect, because sometimes we will be reaching across for assets, but it's a pretty good solution in general.

Secondly, the refactor allows me to better position common assets. This was something I was thinking about when I was creating the KinematicDriver script - that's a script that needs to apply to a whole class of different scenes (what I've dubbed "motion AI" because it's AI that moves). So having a motion_ai directory with a common subdirectory allows us to better group our KinematicDriver script with the the scenes that use it. Our common items are now more generally available.

Finally, as time has gone on, we have experienced a natural accrual of unecessary assets and structures. A lot of stuff was left from the Boids prototype, and a lot of the starting directories had been structured to work around the Boid directories. For example, the "formation" directory had been acting as a catch-all since we made it, when it was originally created to differentiate 3D assets from the 2D Boid assets. Refactoring allows us to remove that useless stuff.


Sunday 2020-11-01 19:13:05 by Jiří Barouš

Nofall, Godmode, Bstech changes (#10404)

'NOFALL' is now a status flag instead of being a var specific to BSTechs. It allows the mob to move between Z-levels and through empty space; even to 'fly up' against gravity. However the tech can no longer use this to 'phase into' matter if there is something above them.
...for that you want to use Ruin-Everything instead: incorporeal movement now has an additional type that's (still) just like a ninja's, but it also allows you to move between Z-levels.
Adds the anti-gravity verb to the Bluespace Robot preset and starts them with 'NOFALL' on.
When using 'GODMODE' you will no longer take damage when you fall; instead a cool message will be shown and a quiet thump will be played.
'GODMODE' now protects you from the awful effects of running - you can run indefinitely and won't take damage from it.
Thanks to the above changes the BST is now self-contained in a single file (well except for the robot preset).
To facilitate the above changes several godmode and incorporeal checks have been added (mostly to movement procs). It cuts on some extra proc overrides and type checks. Also results in a more 'natural' experience when using NOFALL, GODMODE or incorporeal movement.
Changed incorporeal values to defines.
Added a "darkvision" mode for the BST goggles.
I also updated some of the BST verbs to be more descriptive.

Sunday 2020-11-01 20:42:22 by Ruffina Koza

Merge pull request #228 from dreamland-mud/feature/vuln-holy-vs-blessed-drink

Vulnerability to holyness prevents from drinking from a holy source.


< 2020-11-01 >