1,201,345 events recorded by gharchive.org of which 1,201,345 were push events containing 1,598,797 commit messages that amount to 105,182,415 characters filtered with words.py@e23d022007... to these 34 messages:
47923/4.14.259,fix sftp+httpdStatusrate/mode. merry fkn christmas. "first came flame, then came autotune" - randy marsh
-
tried to fix the httpd javascript a little more. i think it's better now.
-
sftp now works properly. i tested it on my own box. it had to do with the shitty syslog used by busybox. anyways, it's all good.
-
and probably most notably: the rates/mode of the wireless clients are now correct. i didn't even notice how wrong they were until today. since all i have is VHT80 stuff, i can confirm it will at least show that, in addition to the same rates reported by the client. pretty fucking dope.
a release worthy of the build date!
merry FUCKING christmas, and go fuck yourself!! - the washington MF redskins
- Shelly's room, evening. Randy knocks on her door *
Randy Shelly, that's enough time on your phone.
Shelly Leave me alone, Dad! Stop nagging me all the time!
Randy You know we're all cutting down on phone time.
Shelly [sits up]
Don't limit me! You don't even understand me!
Randy [sees a poster of himself as <'famous' "musician">, his secret identity]
Yeah. I don't understand you at all. A lot you know.
[walks away saddened]
* The Marsh garage *
-
Randy is adding more stacks of cash to those already *
-
hidden behind the poster. A door opens and Randy *
-
quickly seals it up. *
-
He gets to his workbench just as Stan closes the door. *
Stan Uh hey Dad. I need to talk to you.
Randy Oh really? A-About... about what?
Stan Dad, is it possible for someone to be one way on the outside but totally different on the inside?
[Randy sighs deeply and stands up to walk]
I mean, can someone identify as one sex but be
something else but still have it be nothing about sex?
Randy Yes. Yes, Stan. I am <'famous' "musician">.
Stan ...What?
Randy It started off so simple. There's a guy at work. Hanson. He would use the bathroom and just blow the thing up, you know? Not only that, but he was in there all the time! I finally got fed up and pretended to be a woman. I called myself <'famous' "musician">. Have you ever been in a woman's bathroom, Stan? It's all clean and there's enough stalls for everyone. It was so freeing. I started singing while I was in there, and then I- started writing things down.
Stan Well you said you knew a guy at work who was <'famous' "musician">'s uncle.
Randy Yah, that's my cover.
Stan The chick that wrote the theme song to the new , is you?
Randy Yeah.
[turns around and faces Stan]
The record company messed it all up. It was supposed to go:
"<shitty recession stimulus-funded book and movie series>,
yah yah yah, yah yah yah! <shitty recession stimulus-funded
book and movie series>."
But they just- do what they want with my songs.
Stan Wha-wait, <'famous' "musician"> sounds like a girl.
Randy Autotune. Wanna see how I do it?
[moments later, a music program pops up.
Twelve tracks are shown at lower left]
I come up with all my best stuff in the bathroom at work.
I use this program to import the recordings I make on my phone.
[plays the highlighted track]
"Yeah yeah, feeling good on a Wednesday. Sparklinnnnn'
thoughts. Givin' me the hope to go ohhhn"
[farts and poop noises]
"Oh! Whoa. What I need now is a little bit of shelter."
Stan Dad, <'famous' "musician">'s music is actually really good.
Randy Thanks.
But it gets even better when I add the drum loops.
[replays the same track with drum loops added]
Then with the computer I can actually quantize everything.
[brings up the quantizer and chooses his settings]
Backup instruments.
[scale, beats, bass, tambourine, guitars, strings]
And then finally I use the Autotune.
["Auto-Tuner v10." He chooses his settings there, and
the song is transformed. The same track is now enhanced
with <no name shitty "musician">'s voice and no trace of Randy]
"Sparklin' thoughts, feelin' good on a Wednesday.
Givine me the hope, givin' givin' me the hope to go ohhhn.
What I need is a little bit of shelter."
[this is all too much for Stan to take in, and he passes out.]
[Randy notices]
Stan?
drm: Handle dim for udfps
-
Apparently, los fod impl is better than udfps cuz it has onShow/HideFodView hook, which allows us to toggle dimlayer seamlessly.
Since udfps only partially supports the former one, we'd better kill dim in kernel. This is kinda a hack but it works well, bringing perfect fod experience back to us.
Co-authored-by: Art_Chen [email protected] Signed-off-by: alk3pInjection [email protected] Change-Id: I80bfd508dacac5db89f4fff0283529c256fb30ce
We're going back to vim.
Look, I love emacs (well, doom emacs anyway). But I think it's time. I need something that starts a litte quicker. Easy to take where I need it. Larger community (I hate making things myself tbh...). Neovim is that.
So I cleaned up my vim config and hopefully it stays clean.
Got that Zoom Overshoot glitch fixed BITCH
Don't feel like filling out that little thing I've been doing normally but I did in fact fix the glitch where players would overshoot a zoom. SORT OF. The problem is that it doesn't work with yoyo zooming but come onnnnnn that shit oughtta be easy riiiight? In theory all I have to do is when a yoyo zoom happens tell the script "we have a bit more distance to travel before you shut us down" and then the script will totally give us that distance to travel and it'll all work out. Or maybe it won't and we'll have to win a skii competition to win the skii resort back to get that greedy fucking cunt of a script to give us our motherfucking goddamn distance back before we fucking take it back you motherfuckers just try and pry it from my goddamn cold dead hands you motherfucker just fucking try it I fucking dare you you piece of shit I fucking DARE you!
�[1;36m"Think in the morning. Act in the noon. Eat in the evening. Sleep in the night."�[1;m �[1;35m--William Blake�[1;m�[0m
I wasn't expecting to make another push today...
I was gonna go back to playing Resident Evil 8 but I figured fuck it I'll see if getting the Zoom glitch fixed with yoyo zooming worked as easy as I thought it would and well uh... butter my bussy and call me Sally it sure fucking did so yeah...
Shit Done Today:
- Zooming (even yoyo zooming) no longer has the issue of Olaf flying past the thing. I made a failsafe to safeguard against it
- What were you expecting more? Fuck you it's Christmas
Glitches Fixed:
- Sometimes Olaf will Zoom past something he wants to zoom to
Noticed Glitches:
- Sometimes a missed parry does enough damage to kill the player regardless of the amount of their health? Gotta look into what's causing that wtf
[MIRROR] Nerfs the shit out of the felinid tail grab mood buff. (#1494)
- Nerfs the shit out of the felinid tail grab mood buff (#62768)
Mood controls your movespeed. Making Felinids objectively the best mood management race provided your metagame buddyfriend pulls your tail once every two minutes is insane, even as a meme.
A +5 mood buff was ridiculously good. This is better than the antag mood buff which is 4, equal to the cult buff for sacrificing which is 5, better than tripping balls, better than playing an arcade game and winning, better than the upgraded hug, equal with the best hug, and frankly one of the easiest best mood buffs you can get. And stacks with all the other ones.
- Nerfs the shit out of the felinid tail grab mood buff.
Co-authored-by: Iamgoofball [email protected]
[MIRROR] Nerfs the shit out of the negative sprayed with water mood event for Felinids (#1493)
- Nerfs the shit out of the negative sprayed with water mood event for Felinids (#62769)
Mood controls your movespeed. Making Felinids get their movespeed tanked because someone tried to fire extinguisher them is insane. Movespeed is the most important factor in SS13 when it comes to just about everything, it's how we punish people for damage after all.
A -5 mood is insanely punishing. It is equivalent to getting smitten by the gods, worse than a terrible noogie, worse than being bald, worse than literally throwing up all over yourself, worse than losing your family heirloom, and worse than having your eye stabbed out. This sucks for how easy it is to inflict on someone, especially considering the most common method of inflicting this is trying to fire extinguisher someone who's lit themselves on fire.
🆑 balance: Nerfs the felinid water spray moodlet /🆑
- Nerfs the shit out of the negative sprayed with water mood event for Felinids
Co-authored-by: Iamgoofball [email protected]
OpenVSP 3.23.0
This version fixes some critical bugs that have been hounding users. If you're using 3.22.0, you certainly want to grab this ASAP.
3.22.0's Faster Update changes came with significant risk of breaking things. Sure enough, that risk was realized. Users have been hitting a handful of update bugs that have made 3.22.0 difficult for some to use. This release fixes all the known Update related bugs. There may be more hiding in the corners, but they'll be the less frequently encountered type.
There are also some updates and features included here. Users of the (relatively new) general XSec capability will enjoy a nice overhaul that factors in lots of user feedback. It barely missed the last release, but even more improvements there have come along in the meantime.
A point-projection algorithm was added and exposed to the API at the request of the M4 Structures Studio developers. Hopefully it meets their needs to improve their toolchain.
These changes alone probably wouldn't warrant a version bump, but there are some library and build process changes that raise the level here a bit. FLTK has been updated to hopefully fix some problems that show up on the brand new MacOS Big Sur. The Triangle library has been replaced with a version modified for better error handling and a more C++ API.
The last change is process rather than code. Our automated build system has moved from Travis-CI and Appveyor to GitHub Actions. This change was forced by an account policy change by Travis-CI. So, the builds may be done with slightly different versions of the OS, compiler, system libraries, Python, etc. So, things that worked before might break. Hopefully it isn't too much and we can sort out any issues. This is the way forward.
Overall, you'll want to get this just to fix all the annoying update problems.
Features:
- Add point projection along an axis algorithms to API.
- Improved background image for Edit XSec type
- Improved re-parameterization of Edit XSec types
- Improvements to Edit XSec GUI
Library & Build Updates:
- Update Code-Eli to support axis projection and other cleanups
- Update FLTK to fix problems seen on MacOS Big Sur
- Update Triangle to version with proper error handling
- Build system moved to GitHub Actions
Bug Fixes:
- Update w/ clustering
- Update of Point Cloud Geom
- Update with non-intersected MeshGeom
- Update wing after paste airfoil
- Update of axis markers for HingeGeom
- Update AxisLength
- Thickness issue with file-type airfoils imported from v2 files
- Radius scaling of corner radius of rounded rectangles on wings
- Errant documentation of vspgeom file format
- Differentiate active airfoil name and active XSec name
- Various issues with Edit XSec types
- Other misc. bugs
subprocess: replace posix_spawnp() with fork()
This code runs posix_spawnp() within a fork() in some cases, in order to "disown" processes which are meant as being started detached. But posix_spawnp() is not marked as async-signal-safe, so what we do is not allowed. It could for example cause deadlocks, depending on implementation and luck at runtime. Turns out posix_spawnp() is useless crap.
Replace it with "classic" fork() to ensure correctness.
We could probably use another mechanism to start a process "disowned" than doing a double-fork(). The only problem with "disowning" a process is calling setsid() (which posix_spawnp() didn't support, but maybe will in newer revisions), and removing as as parent from the child process (the double-fork() will make PID 1 the parent). But there is no good way to either remove us as parent, or to "reap" the PID in a way that is safe and less of a mess than the current code. This is because POSIX/UNIX is a miserable heap of shit. (Less shit than "alternatives" like win32, no doubt.)
Because POSIX/UNIX is a miserable heap of shit, execvp() is also not specified as async-signal-safe. It's funny how you can run a full fledged HTTP server in an async-signal-safe context, but not start a shitty damn process. Unix is really, really, really extremely bad at this process management stuff. So we reimplement execvp() in an async-signal-safe way.
The new code assumes that CLOEXEC is a thing. Since POSIX/UNIX is such a heap of shit, O_CLOEXEC and FD_CLOEXEC were (probably) added at different times, but both must be present. io.h defines them to 0 if they don't exist, and in this case the code will error out at runtime. Surely we could do without CLOEXEC via fallback, but I'll do that only if at least 1 bug is reported wrt. this issue.
The idea how to report exec() failure or success is from musl. The way as_execvpe() is also inspired by musl (for example, the list of error codes that should make it fail is the same as in musl's code).
vo_direct3d: rip out texture video rendering path
This isn't useful anymore. We have a much better d3d11 renderer in vo_gpu. D3D11 is available in all supported Windows versions. The StretchRect path might still be useful for someone (???), and leaving it at least evades conflict about users who want to keep using this VO for inexplicable reasons. (Low power usage might be a justified reason, but still, no.)
Also fuck the win32 platform, it's a heap of stinky shit. Microsoft is some sort of psycho clown software company. Granted, maybe still better than much of the rest of Silly Con Valley.
command: add property to return text subtitles in ASS
See manpage additions. This was requested, sort of. Although what has been requested might be something completely different. So this is speculative.
This also changes sub_get_text() to return an allocated copy, because the buffer shit was too damn messy.
Bug 5055: FATAL FwdState::noteDestinationsEnd exception: opening (#877)
The bug was caused by commit 25b0ce4. Other known symptoms are:
assertion failed: store.cc:1793: "isEmpty()"
assertion failed: FwdState.cc:501: "serverConnection() == conn"
assertion failed: FwdState.cc:1037: "!opening()"
This change has several overlapping parts. Unfortunately, merging individual parts is both difficult and likely to cause crashes.
FwdState used to check serverConn to decide whether to open a connection to forward the request. Since commit 25b0ce4, a nil serverConn pointer no longer implies that a new connection should be opened: FwdState helper jobs may already be working on preparing an existing open connection (e.g., sending a CONNECT request or negotiating encryption).
Bad serverConn checks in both FwdState::noteDestination() and FwdState::noteDestinationsEnd() methods led to extra connectStart() calls creating two conflicting concurrent helper jobs.
To fix this, we replaced direct serverConn inspection with a usingDestination() call which also checks whether we are waiting for a helper job. Testing that fix exposed another set of bugs: The helper job pointers or in-job connections were left stale/set after forwarding failures. The changes described below addressed most of those problems.
A proper fix for Bug 5055 required answering a difficult question: When should a dying job call its callbacks? We only found one answer which required cooperation from the job creator and led to the following rules:
-
AsyncJob destructors must not call any callbacks.
-
AsyncJob::swanSong() is responsible for async-calling any remaining (i.e. set, uncalled, and uncancelled) callbacks.
-
AsyncJob::swanSong() is called (only) for started jobs.
-
AsyncJob destructing sequence should validate that no callbacks remain uncalled for started jobs.
... where an AsyncJob x is considered "started" if AsyncJob::Start(x) has returned without throwing.
A new JobWait class helps job creators follow these rules while keeping track on in-progress helper jobs and killing no-longer-needed helpers.
Also fixed very similar bugs in tunnel.cc code.
-
Many ConnOpener users are written to keep a ConnectionPointer to the destination given to ConnOpener. This means that their connection magically opens when ConnOpener successfully connects, before ConnOpener has a chance to notify the user about the changes. Having multiple concurrent connection owners is always dangerous, and the user cannot even have a close handler registered for its now-open connection. When something happens to ConnOpener or its answer, the user job may be in trouble. Now, ConnOpener callers no longer pass Connection objects they own, cloning them as needed. That adjustment required adjustment 2:
-
Refactored ConnOpener users to stop assuming that the answer contains a pointer to their connection object. After adjustment 1 above, it does not. HappyConnOpener relied on that assumption quite a bit so we had to refactor to use two custom callback methods instead of one with a complicated if-statement distinguishing prime from spare attempts. This refactoring is an overall improvement because it simplifies the code. Other ConnOpener users just needed to remove a few no longer valid paranoid assertions/Musts.
-
ConnOpener users were forced to remember to close params.conn when processing negative answers. Some, naturally, forgot, triggering warnings about orphaned connections (e.g., Ident and TcpLogger). ConnOpener now closes its open connection before sending a negative answer.
-
ConnOpener would trigger orphan connection warnings if the job ended after opening the connection but without supplying the connection to the requestor (e.g., because the requestor has gone away). Now, ConnOpener explicitly closes its open connection if it has not been sent to the requestor.
Also fixed Comm::ConnOpener::cleanFd() debugging that was incorrectly saying that the method closes the temporary descriptor.
Also fixed ConnOpener callback's syncWithComm(): The stale CommConnectCbParams override was testing unused (i.e. always negative) CommConnectCbParams::fd and was trying to cancel the callback that most (possibly all) recipients rely on: ConnOpener users expect a negative answer rather than no answer at all.
Also, after comparing the needs of two old/existing and a temporary added ("clone everything") Connection cloning method callers, we decided there is no need to maintain three different methods. All existing callers should be fine with a single method because none of them suffers from "extra" copying of members that others need. Right now, the new cloneProfile() method copies everything except FD and a few special-purpose members (with documented reasons for not copying).
Also added Comm::Connection::cloneDestinationDetails() debugging to simplify tracking dependencies between half-baked Connection objects carrying destination/flags/other metadata and open Connection objects created by ConnOpener using that metadata (which are later delivered to ConnOpener users and, in some cases, replace those half-baked connections mentioned earlier. Long-term, we need to find a better way to express these and other Connection states/stages than comments and debugging messages.
We improved many closure callbacks to make sure (to the extent possible) that Connection and other objects are in sync with Comm. There are lots of small bugs, inconsistencies, and other problems in Connection closure handlers. It is not clear whether any of those problems could result in serious runtime errors or leaks. In theory, the rest of the code could neutralize their negative side effects. However, even in that case, it would only be a matter of time before the next bug bites us due to stale Connection::fd and such. These changes themselves carry elevated risk, but they get us closer to reliable code as far as Connection maintenance is concerned. Without them, we will keep chasing deadly side effects of poorly implemented closure callbacks.
Long-term, all these manual efforts to keep things in sync should become unnecessary with the introduction of appropriate Connection ownership APIs that automatically maintain the corresponding environments (TODO).
Improved Security::PeerConnector::serverConn and Http::Tunneler::connection management, especially when sending negative answers. When sending a negative answer, we would set answer().conn to an open connection, async-send that answer, and then hurry to close the connection using our pointer to the shared Connection object. If everything went according to the plan, the recipient would get a non-nil but closed Connection object. Now, a negative answer simply means no connection at all. Same for a tunneled answer.
Refactored ICAP connection-establishing code to to delay Connection ownership until the ICAP connection is fully ready. This change addresses primary Connection ownership concerns (as they apply to this ICAP code) except orphaning of the temporary Connection object by helper job start exceptions (now an explicit XXX). For example, the transaction no longer shares a Connection object with ConnOpener and IcapPeerConnector jobs.
Probably fixed a bug where PeerConnector::negotiate() assumed that sslFinalized() does not return true after callBack(). It may (e.g., when CertValidationHelper::Submit() throws). Same for PeekingPeerConnector::checkForPeekAndSpliceMatched().
Fixed FwdState::advanceDestination() bug that did not save ERR_GATEWAY_FAILURE details and "lost" the address of that failed destination, making it unavailable to future retries (if any).
Polished PeerPoolMgr, Ident, and Gopher code to be able to fix similar job callback and connection management issues.
Polished AsyncJob::Start() API. Start() used to return a job pointer, but that was a bad idea:
-
It implies that a failed Start() will return a nil pointer, and that the caller should check the result. Neither is true.
-
It encourages callers to dereference the returned pointer to further adjust the job. That technically works (today) but violates the rules of communicating with an async job. The Start() method is the boundary after which the job is deemed asynchronous.
Also removed old "and wait for..." post-Start() comments because the code itself became clear enough, and those comments were becoming increasingly stale (because they duplicated the callback names above them).
Fix Tunneler and PeerConnector handling of last-resort callback requirements. Events like handleStopRequest() and callException() stop the job but should not be reported as a BUG (e.g., it would be up to the callException() to decide how to report the caught exception). There might (or there will) be other, similar cases where the job is stopped prematurely for some non-BUG reason beyond swanSong() knowledge. The existence of non-bug cases does not mean there could be no bugs worth reporting here, but until they can be identified more reliably than all these benign/irrelevant cases, reporting no BUGs is a (much) lesser evil.
TODO: Revise AsyncJob::doneAll(). Many of its overrides are written to check for both positive (i.e. mission accomplished) and negative (i.e. mission cancelled or cannot be accomplished) conditions, but the latter is usually unnecessary, especially after we added handleStopRequest() API to properly support external job cancellation events. Many doneAll() overrides can probably be greatly simplified.
removed my "feature"
enjoy cringe larp path and remember to walk today instead of laying in pc chair fuckers
1.08.0 [Game Version 1.05e]
Original Release Date: 3 May, 2012 [Wiz]
Changelog: 1.08:
- Players can now do De Jure wars against other religion groups, until I rework the way joining Holy Wars works.
- Tumbling your courtiers is no longer a male-only or straight-only activity.
- Crusader states should now always become Feudal, even if the most participating attacker in the Crusade is not.
- Halved the effects of legalism on demesne size.
- Vassals will no longer join a claim on liege war that is not targeting one of the liege's primary-level titles. This should prevent situations where you are fighting your liege for a claim on a vassal and that vassal joins the war on your side.
- Tweaked West Africa to be slightly more historical and considerably more balanced.
- Increased frequency of bad events (buildings destroyed, characters killed, armies rising up) from revolts.
- Restored economic buildings to former levels, with the exception of ports as they made coastal cities rather overpowered at their previous income levels.
- If you press a claim of lower rank than their primary title on behalf of a vassal, they will now stay in your realm (so you can press Count claims on behalf of Dukes, etc).
- Fixed some issues with weird straits caused by province realigning.
- You can no longer declare third-party de jure wars on characters of a different religion group.
1.07:
- Now compatible with version 1.05e.
- Ran the mod through the validator and fixed numerous minor errors.
- De Jure vassals are now more inclined to choose depose CBs over independence war CBs.
- Reduced the number of short reign years but increased the opinion penalties for Regency, to make succession issues rarer but more serious.
- Reduced the opinion boost for being entrusted with a ward.
- Increased the cost of gifts, to make the cost better scaled to how powerful they have become (I would reduce their opinion effects if I could).
- Reduced the dynastic opinion bonus to 15 on account of the tendency of dynasty members to stay loyal during revolts by non-dynasty members and the reduced opinion maluses from title claimaints.
- The cost of fabricating claims now scales with your primary title level. Fabricating a claim on a County/Duchy costs 100/200, 150/300 and 200/400 for Counts, Dukes and Kings/Emperors respectively.
- A character that wins their invasion war (for example, William the Conqueror if he wins the Norman Invasion) now gains a ten-year truce modifier that prevents all external wars, in the same way newly formed crusader states do.
- Holy Orders will now get the ten-year truce modifier when they are granted a piece of land via event.
- The negative effects of bankruptcy now scale, with increasing penalties for every 250 gold you owe up to a maximum of 1000.
- It is no longer possible to create the Mongol/Timurid titles.
- Fixed numerous bugs with depose type CBs where wars would not end properly or revolters would become independent as a result of an abdication. As a part of these fixes, it will now take 1 day between the end of a successful depose war and the actual abdication of the loser.
- Oman now starts independent. I realize this is ahistorical, but equally ahistorical is the fact that it becomes the final holdout of the Seljuk Turks in most games, and I feel having it independent improves gameplay in the area.
- Cumans are now an Empire and Cherson is now in the Kingdom of Crimea. This was done to try and prevent Cumans from always ending up as a de jure title.
- Increased prestige gain for marrying into prestigious dynasties.
- Icelandic is now a separate culture.
- You can no longer fight De Jure wars against characters of a different religion group, to prevent them being used to get around the Holy War defensive chains.
- Reduced Holy Order cost back to 50 piety.
- Muslims can now only appoint a single concubine, as court sizes quickly get ridiculous with three of them.
- Added barony names, starting baronies and a reasonable number of barony slots to West Africa, so the area is now actually worth playing in. Many of the barony names have no historical grounds (named after modern settlements) so any input on name replacements from people knowledgeable of medieval West Africa would be welcome.
- Split Mauretania into the Kingdoms of Mauretania and Morocco.
- Integrated the All the Way to Timbuktu mod that adds 30 new provinces in West Africa, along with three new Kingdoms and a new Empire.
- Integrated Syren's Nicknames Mod with over 90 new ruler nicknames.
- Integrated Better Looking Characters mod. The parts that require the Mongol Faces DLC were placed in the optional module 'Mongol Faces'.
- The Papal State is now an Empire, both to prevent the Pope from being vassalized and to prevent the Papal State from assimiliating Spoleto.
- Removed the building cost reduction on oversee construction, but made it so the 'Meets Master Builder' event lowers the cost of all construction in the province by 20% for 10 years.
- Reduced the tax bonus from having your Steward collect taxes.
- Reduced the power of economic buildings. On average, a tax income building will pay itself back in 100 years.
- Pressing claims on behalf of claimaints now works as in vanilla, where a character will only become your landed vassal if they are your de jure vassal or of your dynasty.
- There are now three Muslim Titlar Kingdoms in Iberia: Al-Mawsat (Capital: Granada), Al-Xarq (Capital: Porto) and Al-Garb (Capital: Zaragoza). A ruler that holds all three can form the Titular Empire of Al-Andalus.
- Fixed a bug that was preventing Crusade/Jihad notifications from working properly.
- The AI must now spend some piety to call a Crusade or Jihad (preventing repeated failed Crusades by the same character).
- A ruler defending against a Crusade or Jihad can now call on a very large portion of their levies (players cannot do so if they are also fighting an offensive war).
1.09.0
Original Release Date: 10 May, 2012 [Wiz]
Changelog: 1.09:
- Fixed a bug that was causing significant slowdown due to bloated AI courts. Game performance should now be much better.
- Moved most CK2+ events to the yearly or bi-yearly character event pulses to further improve performance.
- Increased AI tendency to plot.
- Reduced opinion bonus for same dynasty.
- Integration avee's family relations mod that increases character's opinions of their close family.
- Realms without crown authority can now have up to the second level of taxation/levy laws.
- Fixed a bug that was breaking the invasion CB.
- Further improved title distribution AI, to make the AI less willing to hand away its demesne when there are other alternatives.
- Added dynasty, culture and religion information to character tooltips.
- Reduced minimum gift size (but kept the increased gift scaled cost the same).
- Increased the plot power required to execute the better assassination decisions, and also slightly increased their chance of success.
- Removed Castellans. While I feel they are a good feature, I couldn't find a way to fix the various bugs and issues with the way honorary titles are coded, and I don't want to have a permanently half-broken feature in the mod.
- Greatly increased prestige gain from winning battles.
- Reworked the way joining wars works. The ask to join war diplomatic mechanic is now reserved solely for Crusades. Instead, when a ruler is declared on by a ruler of a different faith for any conquest-type CB (holy war, claim, de jure claim, etc), they get the option to ask all their neighbours of the same faith (neighbour being defined as sharing a border or sharing provinces in the same kingdom). Chance of joining depends on relations, traits, dynastic ties and other such factors. This should make the AI far more reasonable and realistic about which holy wars it joins (you no longer get all of North Africa defending Sicily, for instance), and simultaneously eliminates the exploit of using other CBs to get around holy war defensive chains.
- Reduced demesne size requirements for raising crown authority to a level the AI can better cope with.
- Buildings can now be randomly destroyed as a consequense of provinces being besieged.
- Added province prosperity mechanics. Provinces now have a prosperity level that goes (in descending order): Rich - Prosperous - Normal - Poor - Struggling. Prosperity level affects the tax and levies you can get from the province, and will go up and down from various events. Peace and quiet tends to increase province prosperity, while war and rebellions reduces it.
- Restored the ability for women to pass on pressable claims to their kids. This makes it possible once again to marry into claims.
- Province conversions will now very slightly increase the moral authority of the converting religion, and decrease the authority of the converted.
- Religions no longer gain any moral authority from the diplomacy of their head of religion.
- Anti-Popes no longer cause continous moral authority loss, but the moral authority loss from creating one was greatly increased.
- Reduced the moral authority hit to the loser in a Crusade.
- Reduced frequency of heresies.
- Reduced maintenance cost of levies.
- Reduced the bonus troops granted to rulers defending against a Crusade/Jihad.
- The Almoravids once again start as a Sultanate instead of an Emirate, as this leads to more historical results.
- Fixed a bug where the Pope getting the land in a Crusade would result in a smattering of independent counts.
- The inherited/appointed titles law is now available to Byzantium (to represent the Theme system).
- Added the titular kingdoms of Sardinia, Dublin, Mann and the Isles, Mercia and Cornwall.
- Newborn characters now start with negative stats, in an effort to reduce the extreme stat inflation from education over time. An adjustment event fires later in childhood to ensure that base stats do not remain in the negative.
- Removed the vassal opinion bonus from Elective. While it makes sense, it feel it makes an already extremely good succession law even better.
- Primogeniture no longer lowers the opínion of your dynasty.
- Elective now lowers the opinion of your dynasty (due to opening up the succession outside of the bloodline).
- Tweaked mercenaries to have more 500 and 1000-size companies.
- Added mercenaries to West Africa.
- Tweaked provinces in West Africa and added an additional province to the Duchy of Laayoune.
- Fixed a bug where changing the crown authority of an Empire would cause multiple stacking opinion penalties.
1.12.0 [Game Version 1.05f]
Original Release Date: 18 May, 2012 [Wiz]
Changelog: 1.12:
- Now compatible with official patch 1.05f.
- Upgraded to latest version of Culturally Different Cities.
- The Komnenos dynasty now starts with claims to Byzantium in 1066.
- Kingdoms and Empires must now have at least Medium crown authority to fight a de jure war over a province whose Duchy they do not control.
- Removed the attribute nerfs on birth since new education system makes them redundant (and I can always just tweak good education trait chances down if stat inflation becomes a problem again).
- Added a new education system. Children will now get an education trait sometime between the age of 15 and 16 instead of getting it on their 16th birthday. The trait they get will always be the same archetype as their tutor (ie a tutor with an intrigue trait will generate an intrigue trait for their student) but which trait the child gets is now influenced by the child's own attributes, so a high martial child is likely to do well in a martial education for example. Randomization was also increased so the child doesn't just get the exact same trait as their tutor almost every time. Overall, the higher end education traits should now be significantly rarer.
- Added a notification event that fires when one of your close relatives turns 16, letting you know that they are an adult and which education trait they got (to compensate for the lack of an education notification).
- Reduced the power/cost of universities and increased the power/cost of monastic schools, to make Temples the foremost holding for research speed.
- Decreased the chance of healthy women dying in childbirth.
- Upgraded to latest version of family relations mod.
- Sped up the spread of English and Sicilian cultures.
- The learning and piety of a head of religion will now influence the moral authority of that religion through events.
- Randomly generated characters (both at game start and after) should now properly get assigned genetic traits.
- Removed the Arrange Courtier Marriages decision. Instead, courtiers with money and a position on your council will marry on their own.
- Reduced the piety cost of early Crusades, to make Crusade-less games less likely.
- When you win an independence war, the defeated ruler will now get claims on your titles.
- Changed the way loans work. Instead of an event that fires when you go into the red, a loan can now be taken at any time through a decision. The loan amount scales to your income, and is always a five-year loan at 25% interest. If you do not have the money to pay it back on the due date, you can extend it for another five years by paying the interest. If your character dies with an unpaid loan, the debt will be transfered to your heir.
- The AI will now make use of loans during wartime in order to buy mercenaries and fund its armies.
- AI will now only change succession laws under fairly specific circumstances (so half the world won't switch to Primogeniture on day one of the game).
- Reduced the penalty for characters dying in prison.
- Reduced the chance of prisoners in the dungeon falling ill.
- Imprisoned characters can no longer join a revolt.
- Increased the chance of characters with titles escaping from prison. The higher ranked the character, the higher the chance of them making the attempt.
- Reduced starting troop multiplier for Alp Arslan (due to the changes below).
- Added more buildings to the Seljuk Turks and increased the strength of the Ghilmans.
- Removed some holdings in Byzantium and reduced the strength of the Varangian Guard.
- Further improved performance by removing some unnecessary AI checks and moving others to events.
- Added two new ambitions: Befriend Liege and Befriend Head of Religion.
- Building destruction on siege events should now work correctly.
- Added two events associated with the 'Research Economy Tech' action. The positive event improves province prosperity, while the negative event results in temporary revolt risk.
- Center leader martial skill is now a very important factor for reducing attrition to your troops.
- Reduced the effects of Siege Equipment, to balance out for the removal of Military Fortifications.
- Replaced the Military Fortifications tech with Logistics, which increases supply limits to better correspond to later game army sizes.
- Attrition is once again a factor in war, although at greatly reduced maximum rates and heavily tweaked holding supply effects.
- Reduced garrison sizes to make stalled wars less likely.
- Increased effectiveness of defending garrison during assaults (to make up for lower numbers).
- Tweaked province prosperity events so that the extreme ends of the spectrum (Rich/Struggling) are less common.
- When pushing third-party claims, the tooltip will no longer say that the claimaint will become your landed vassal if that is not possible because the pushed title is equal or higher rank than your own.
- When pushing third-party claims, the claimaint will now remain your vassal if the title you are pushing is in the same realm as your own (ie held by your liege or one of his/her vassals).
- Pushing a third-party claim will no longer turn a character independent if the title you pushed for him or her was not already independent.
- You can now plot to kill characters whose title you or your child is a pretender to.
- Removed the demesne size requirements for raising crown authority, as they all too often locked the AI at autonomous vassals.
- Most titles formable by Christians are now also formable by Pagans.
- Kingdom of Wends can now be formed by Wends of any religion.
sched/core: Fix ttwu() race
Paul reported rcutorture occasionally hitting a NULL deref:
sched_ttwu_pending() ttwu_do_wakeup() check_preempt_curr() := check_preempt_wakeup() find_matching_se() is_same_group() if (se->cfs_rq == pse->cfs_rq) <-- BOOM
Debugging showed that this only appears to happen when we take the new code-path from commit:
2ebb17717550 ("sched/core: Offload wakee task activation if it the wakee is descheduling")
and only when @cpu == smp_processor_id(). Something which should not be possible, because p->on_cpu can only be true for remote tasks. Similarly, without the new code-path from commit:
c6e7bd7afaeb ("sched/core: Optimize ttwu() spinning on p->on_cpu")
this would've unconditionally hit:
smp_cond_load_acquire(&p->on_cpu, !VAL);
and if: 'cpu == smp_processor_id() && p->on_cpu' is possible, this would result in an instant live-lock (with IRQs disabled), something that hasn't been reported.
The NULL deref can be explained however if the task_cpu(p) load at the beginning of try_to_wake_up() returns an old value, and this old value happens to be smp_processor_id(). Further assume that the p->on_cpu load accurately returns 1, it really is still running, just not here.
Then, when we enqueue the task locally, we can crash in exactly the observed manner because p->se.cfs_rq != rq->cfs_rq, because p's cfs_rq is from the wrong CPU, therefore we'll iterate into the non-existant parents and NULL deref.
The closest semi-plausible scenario I've managed to contrive is somewhat elaborate (then again, actual reproduction takes many CPU hours of rcutorture, so it can't be anything obvious):
X->cpu = 1
rq(1)->curr = X
CPU0 CPU1 CPU2
// switch away from X
LOCK rq(1)->lock
smp_mb__after_spinlock
dequeue_task(X)
X->on_rq = 9
switch_to(Z)
X->on_cpu = 0
UNLOCK rq(1)->lock
// migrate X to cpu 0
LOCK rq(1)->lock
dequeue_task(X)
set_task_cpu(X, 0)
X->cpu = 0
UNLOCK rq(1)->lock
LOCK rq(0)->lock
enqueue_task(X)
X->on_rq = 1
UNLOCK rq(0)->lock
// switch to X
LOCK rq(0)->lock
smp_mb__after_spinlock
switch_to(X)
X->on_cpu = 1
UNLOCK rq(0)->lock
// X goes sleep
X->state = TASK_UNINTERRUPTIBLE
smp_mb(); // wake X
ttwu()
LOCK X->pi_lock
smp_mb__after_spinlock
if (p->state)
cpu = X->cpu; // =? 1
smp_rmb()
// X calls schedule()
LOCK rq(0)->lock
smp_mb__after_spinlock
dequeue_task(X)
X->on_rq = 0
if (p->on_rq)
smp_rmb();
if (p->on_cpu && ttwu_queue_wakelist(..)) [*]
smp_cond_load_acquire(&p->on_cpu, !VAL)
cpu = select_task_rq(X, X->wake_cpu, ...)
if (X->cpu != cpu)
switch_to(Y)
X->on_cpu = 0
UNLOCK rq(0)->lock
However I'm having trouble convincing myself that's actually possible on x86_64 -- after all, every LOCK implies an smp_mb() there, so if ttwu observes ->state != RUNNING, it must also observe ->cpu != 1.
(Most of the previous ttwu() races were found on very large PowerPC)
Nevertheless, this fully explains the observed failure case.
Fix it by ordering the task_cpu(p) load after the p->on_cpu load, which is easy since nothing actually uses @cpu before this.
Fixes: c6e7bd7afaeb ("sched/core: Optimize ttwu() spinning on p->on_cpu") Reported-by: Paul E. McKenney [email protected] Tested-by: Paul E. McKenney [email protected] Signed-off-by: Peter Zijlstra (Intel) [email protected] Signed-off-by: Ingo Molnar [email protected] Link: https://lkml.kernel.org/r/[email protected]
1.15.0 [Game Version 1.05g]
Original Release Date: 29 May, 2012 [Wiz]
Changelog: 1.15:
- Now compatible with version 1.05g.
- Upgraded to the latest version of Better Looking Characters, which features a number of performance improvements that should make it less memory intensive.
- Integrated Mercator Mod, which improves greatly on the game's terrain with proper mountain placement, river locations, etc.
- Titular titles will now never be elective when created.
- If your demesne laws are higher than what crown authority allows (for example because crown authority went down) an event will now fire that adjusts them to their highest allowed level.
- Added events for pious Muslim or Christian rulers to sponsor missions to a neighbouring Pagan ruler, which have a chance of converting that ruler to the sponsor's faith.
- Reworked the effects of difficulty. Instead of providing flat bonuses to the player or the AI, difficulty now instead influences things such as councillor actions, loans and vassal loyalty. A player on low difficulty will (to name a few effects) find it easier to fabricate claims and have vassals stay loyal during civil wars, while getting the opposite effect on high difficulty. A high difficulty AI will get more claims, better terms on loans and other such things to make up for its various shortcomings versus a player. On Normal, AIs play almost entirely by the same rules as a player. Only a single flat bonus was left in place: Siege speed. High difficulty AIs will be more difficult to siege to account for their tendency to only siege a single province at once.
- Victory in a succession war will now result in taking all the enemy's titles you have claims on in addition to taking the title whose succession you were disputing.
- Reworked civil wars. Vassals who choose to side with their liege will now actively join the war and raise their troops to fight the traitors. To compensate for this, the base chance of vassals joining a civil war was increased.
- AI vassals will now be reluctant to rebel against an AI ruler that has recently been in a civil war.
- It is once again possible for your character's culture to spread to your capital, even if there is no adjacent province of the same culture. The chance is greatly reduced unless your character is independent.
- Neighbours will no longer get a religious call to arms when war is declared between characters of the same religion group (as long as one is not a heresy of the other).
- Further refined education formula. The child's attributes are now more important than the tutor's trait in how well they take to their education, though educator trait still makes a significant difference. Overall frequency of level 3 and 4 education traits were lowered.
- Nearly all decisions now have graphical icons to make them more immediately visually identifiable.
- Martial skill is now much more important in determining who wins a grand tournament.
- Upped Kingdom creation cost to 500 gold and Empire creation cost to 1000 gold.
- Further decreased effects of personal stewardship on demesne limit.
- Removed piety cost for Kingdom creation. While it makes sense for Catholics, it doesn't for pretty much every other faith and it always felt strange how impious, ambitious characters were locked out of making themselves Kings.
- AI rulers will now only attempt to Restore the Papacy once after it is lost. If they make the attempt and fail, the same character will not try again.
- Attempts to Restore the Papacy to Rome can now only be made for 100 years after it is lost.
- De Jure claim wars now always result in seizing the province, to prevent the situations where you would force-vassalize a character and he would revolt immediately as the war ends.
- State martial skill now influences the amount of troops you can raise from your vassals.
- The AI will now usurp Kingdoms that it controls more than 50% of the land in, even if it already has a Kingdom or Empire level title.
- The AI will no longer limit itself to a single Kingdom, creating any Kingdom titles it is eligible for with the exception of titles inside a de jure empire that it holds.
- Added titular Kingdoms of Bavaria, Prussia and Khazaria.
- If a titular kingdom turns de jure, the special creation/usurp penalties from it are now removed (so if the Kingdom of Venice has de jure land, it is no longer only holdable by republics, for example).
- Players without an ambition will now suffer a penalty to their prestige (to prevent an exploit where the player would only pick ambitions as they are about to complete).
- Removed the 'No New Empires' module (as it no longer serves a purpose).
- Implemented a new system of dynamic empires. All de jure Empires except the HRE and Byzantium are now gone, and are instead replaced by a large number of titular empires that can be formed by any ruler with the right culture and 4 kingdom titles. The following empires are currently createable via this system: Latin Empire, Frankish Empire, Occitan Empire, Italian Empire, Roman Empire, Polish Empire, Russian Empire, Persian Empire, Danubian Empire, Spanish Empire, Maghreb Empire, Arabian Empire, Egyptian Empire, Celtic Empire, Nordic Empire, Ethiopian Empire, Britannian Empire, Mali Empire, Lithuanian Empire, Finnish Empire, Magyar Empire, Seljuk Turks, Ottoman Empire and Al-Andalus.
- Removed all religion limits on creating de jure kingdom titles. Instead, some titles will have an 'alternate' version for muslims, and on creating that title the non-muslim title will be destroyed and the muslim title will take its place. If the muslim title is then destroyed and re-created by christians or pagans, it reverts to the non-muslim version. (For example: If a muslim ruler creates Portugal, he will get the Sultanate of Al-Garb instead, with Portugal's de jure lands. If his realm is wiped out and Al-Garb is created by a Christian, that Christian will get the Kingdom of Portugal).
- Fixed some bugs related to starting succession laws. As a result, you will be unable to change succession laws in the first week or so after starting a new game.
- Heresies no longer affect or are affected by moral authority changes from Holy Wars and province conversion.
- Courtiers can now take lovers among other courtiers, and young men or women with much older spouses will be particularily suspectible to romance.
- Changing succession laws now requires and costs 125/250/500/750/1000 prestige for Barons/Counts/Dukes/Kings/Emperors respectively. Changing gender succession laws does not cost prestige.
- Removed crown law requirements for switching succession laws. Medium Crown Authority is still required for switching an Elective Kingdom or Empire away from being Elective.
- You can no longer complete the 'Amass Wealth' objective by taking a loan.
- Increased base amount of troops from holdings.
- Increased build cost of holdings.
- Fixed a bug that caused countries to incorrectly become independent when a third-party claim was pressed.
- Revamped tyranny mechanics. When you perform tyrannical actions (such as imprisoning, banishing or executing characters) without a rightful cause, you will now get tyranny 'points' that translate into a Tyrant trait with a potency from 1 to 100. For each point of tyranny, you suffer penalties to prestige and vassal opinion. Imprisoning and executing characters when you have rightful cause to do so (for example if they rebelled against you) will not result in any tyranny, and the tyranny penalties for banishment are lowered if you have rightful cause. Note that a character revolting/acting dishonorably towards you will only give you cause for ONE punishment, so you can either revoke, banish OR execute them... additional punishments will result in normal amounts of tyranny. Tyranny goes away over time, and will not be inherited by your successor when you die.
- You will now get kinslayer only for executing or assassinating close relatives (rather than any dynasty member).
- Fixed some issues with weird/conflicting assassination plot requirements.
- AI characters that have been caught assassinating before are now less likely to plan new assassinations.
- A character that wins an invasion will now get claims on all Counties and Duchies in the target Kingdom.
- You can no longer pick the ambition to befriend a character you are at war with (and the ambition will abort if you go to war with them).
- Added an ambition to befriend your top liege (if not the same as your direct liege).
1.14.0
Original Release Date: 22 May, 2012 [Wiz]
Changelog: 1.14:
- BLC is now an optional module that requires the Mongol Faces DLC. If you are having issues with graphics, performance or load times, try playing without BLC as it increases CK2's memory usage considerably.
1.13:
- Upgraded to version 7 of Better Looking Characters.
- Fixed a bug that was causing feasts, hunting and summer fairs to become permanently unavailable for a character.
- Jews can now create the Kingdom of Jerusalem.
- Harder difficulty levels will no longer increase AI income, but will lower player income instead (for players who think money is too plentiful).
- Tweaked a vanilla event that was causing Catholic moral authority to increase far too quickly.
- How you vote on your liege's law proposals will now influence his or her opinion of you.
- Fixed a rare bug that would result in characters being given two education traits.
- Further decreased chances of children picking up the higher level education traits.
- When a character usurps their liege's primary title, they will now also take the liege's capital province (so that if a pretender seizes the Byzantine Empire they should also get Constantinople, for example).
- Corrected some newly introduced performance issues.
- Courtiers with honorary titles and money will now marry on their own unless that honorary title is Court Jester or Concubine.
- Extending a loan will now only extend it for two years.
- Exiling characters now costs prestige, to prevent an exploit where a low ranked player could repeatedly imprison and banish his baron vassals for large sums of money.
- Players can now complete many ambitions multiple times, although the rewards for completing them are greatly lessened after the first time.
- Fixed a bug where lack of crown laws would incorrectly reset your demesne laws to the lowest level.
- Fixed some bugs with lover events where women could get impregnated by their female lovers.
- Female councillors will no longer marry other women.
remove my mother's maiden name and the three wacky digits on the back of my debit card, fuck you dotnet compiler
what this actually does is it elaborates on the params.cs file, adding checks for the .minecraft and .minecraft/mods director(y/ies). also started work on the web download thingymajigy.
[IMP] lunch: automatize lunch orders
We would like to automatize lunch as currently all orders are manually ordered and validated, and a cash move has to be manually created each time you want to credit the wallet of some user.
1/ In this commit we add a new widget that comes with the kanban view and will allow to take orders in a friendly manner. 2/ We also add a lunch.supplier model this also allows you to configure an automatic ordering via email. 3/ Introduces new lunch.location model to replace res.partner on suppliers 4/ New mail template for automatic ordering 5/ Add the concept of new products (mark a product as new until some date) 6/ The toppings are now defined by product category 7/ Lunch.order removed, lunch.order.line renamed into lunch.order 8/ New SQL report to get the wallet content (aggregate of lunch.cashmove and lunch.order) 9/ New setting to allow negative wallet (aka overdraft) 10/ Application now remembers what notes and toppings you last ordered with your product 11/ You can change your location using the widget on the kanban view 12/ Edition of the order can be done until the order is arrived
TaskID: 1856876 TaskID: 1916105
closes odoo/odoo#30028
[IMP] qweb: stop requiring t-name-flagged sub-node
QWeb's rendering currently requires that when loading a document instead of rendering the document itself it will render a sub-node with a properly labeled t-name. If a view is invoked by id, ir.qweb will look for a child with a t-name and fix up that t-name such that the base qweb object will find and render it.
This feature mostly exists for JS compatibility (because a single document can contain multiple cross-linkable templates, and it was useful for cross-implementation tests though I'm not sue they're even checked anymore), and the tag kinda took care of it, however with a more proper qweb view it becomes more of a liability / pain in the ass.
Note: turns out there are bits of javascript which read server templates (???) and need to be altered to correctly handle the lack of wrapping.
"11:25am. I needed some extra lounging time after doing it for so long yesterday. Let me chill a bit more. I'll skip the morning session.
12pm. Let me have breakfast here, a bit earlier than usual. After that I'll look into a compositor tutorial.
1:10pm. Done with breakfast. Let me finish the chapter of Circle Zero and then I will start.
1:15pm. Let me start.
https://www.youtube.com/results?search_query=blender+compositor
Let me start with this. This should be informative. Bit by bit, I'll go through all of Blender's features. When I reach my full potential I'll be invincible.
https://software.rajivprab.com/2021/12/26/my-path-to-financial-independence-as-a-software-engineer/
Look at this guy. If I am patient, this is how much I could be making. Even 100k to start off would not be bad. If I could work just for 6m at some cheap job, that would give me insight into what kinds of problems companies face, which would be a huge advantage in getting better paying jobs.
But will humanity even be around in 10, 20 or even 30 years. Even if it does in some kind of virtual zoo, it would be a waste of time making money when I could be cultivating actual superpowers.
The plan I am going with now is the worst. I'll make only a little money off it, and if Simulacrum takes off it will be horrible for the world. AI risk is going to spike, and the plebs will become NPCs even more than they are now. All this to make 2k just to get some crappy chip. But they had it coming. While the rest of the world is moving forward, I have to toil and linger in obscurity without any support. Why not go all out in that case?
I'll burn away my morality and bring it all out in making a interesting story.
When that is a success, I'll implement a genetic programming system, find the superior algorithm, and compound advantages until my external cortex is fully developed.
The path of evolution is not a path that has a chance of failing. With enough computation, it will give me the algorithm. And as a path it is mostly reliant on PL skills and mine are at the appex.
1:30pm. https://youtu.be/xEpVyEi1Hts Compositing in Blender for Beginners (Tutorial)
Let me finally start with this.
1:40pm. Had to take a short break. Let me focus. I've actually rendered the scene using the compositor, but I haven't used the panoramic view. Nevermind that. Let me just follow the tutorial along and see what I can get from it. Then I will make the HDRI.
https://youtu.be/xEpVyEi1Hts?t=653
You can press F and that is going to fill in the wire inbetween these two nodes. Wow.
https://youtu.be/21G2l2EYhLY?t=24 Edge Detect Node for Blender 2.8
Er let me just watch this. I started worrying about duplicate edges, and started snooping around. This caught my eye even if it is does not have anything to do with it.
https://youtu.be/21G2l2EYhLY?t=243
This is really cool. It is worth keeping in mind. It does not come with Blender on its won.
2:05pm. Let me go back to compositing.
https://youtu.be/xEpVyEi1Hts?t=802
Holy shit, how long is he going to keep explaining the blender keys. This is useful, and I did learn a bit, but get on with it.
https://youtu.be/xEpVyEi1Hts?t=1049
I did not know this. Ok, I'll give him a pass on being so thorough. I think at this point I should understand how to use the node UI perfectly.
https://youtu.be/xEpVyEi1Hts?t=1204
Couldn't he have done this after the denoise? Don't tell me it would recomposite the entire scene. Though it just might to save memory.
https://youtu.be/xEpVyEi1Hts?t=1276
I have no idea what lift/gamma/gain are supposed to be or how to use them. I've just about gotten a handle on saturation and value, and contrast. This stuff is too much.
https://youtu.be/xEpVyEi1Hts?t=1569
Interesting idea.
3pm. Had to take a break.
https://youtu.be/bIZrTXtyQkY Introduction to Compositing in Blender
Let me watch this.
https://youtu.be/bIZrTXtyQkY?t=122
I'd never have expected him to build a desert out of planes. I'd actually be interested in his course just for that, but no way I can afford it right now. It isn't important. I could sculpt it. Just add a bunch of dunes and then use the multiplane scrap brush to sharpen them. That would work.
This video is really good advertizing though.
https://youtu.be/bIZrTXtyQkY?t=693
Though both of these videos are introductory lectures, they are worlds apart in their content. I can really see how compositing could be a necessity based on this.
Yesterday I've been doing it till 11:30pm, so I'll take it easy today.
3:45pm. https://youtu.be/bIZrTXtyQkY?t=2221
Just how much crap is he going to add? But I suppose it has educational value.
My personal opinion that these slight effects have little bearing on the overall quality. They are a waste of time.
3:45pm. I had enough of compositing.
https://www.youtube.com/watch?v=bF7RV1My41s Introduction to Compositing in Blender 2.8
Let me watch this just for a bit since it was on the sidebar.
https://youtu.be/bF7RV1My41s?t=402
This tutorial is really good and has additional information. I should have watched this one instead of the other. Let me just do it for a few minutes more.
https://youtu.be/bF7RV1My41s?t=517
Damn it, I should watch this.
Blender has such an insane amount of high quality content on Youtube. Art does not fall behind in programming in terms of sophistication. Programming has more depth, but art has more breadth. There are so many ways of doing it. I need to find my own way otherwise I will be buried in these tutorials. It is inevitable that at the beginning I will be going down dead ends and exploring.
3:55pm. https://youtu.be/bF7RV1My41s?t=606
What are cryptomats?
4:05pm. Had to take a break. Ok, let me do it. I'll watch this 1h video as well. After that, my compositor needs should be satisfied. After this I do not think I'll have to watch much more in terms of tutorials. I should be at the tail ond of my beginner's stage.
After I go through this, I just need to focus on cranking out content. Maybe if my purpose was to do professional animation I'd still have plenty to learn, but this much should be enough.
In any complex program, just the basics are 90% of the benefit of it.
https://youtu.be/bF7RV1My41s?t=269
Ah, it is possible to have multiple output sockets rather than have to duplicate the File Output nodes.
Damn, that other video really tricked me.
https://youtu.be/bF7RV1My41s?t=1317
They mention a whole video on Cryptomatters. I'll leave that for later. It is not that important.
4:45pm. https://youtu.be/bF7RV1My41s?t=1701
Let me stop here. I am focusing on the video at all. This stuff won't be that important to my work.
Let me gather my thoughts.
1) Study the compositor.
2) Render the HDRI and bring it in as an env texture.
I've cleared the first goal. Now it is time to get serious. I do not need all this complex stuff. Blender has thousands of things, but like in programming, the most important things are the basics. Sculpting and modeling. And the procedural generation stuff. Contrast and ramping. Knowing how to make use of nodes and procodural content.
The things that have stuck in my memory will be the things I will need.
Things like color ramps and curves might be trivial to an experienced modeler, but I only learned it in the past week.
All this time has been well spent.
4:55pm. Let me think a bit.
Right now my art direction with the limbo is unmotivated.
My imagination is not particularly vivid, and I can't really think of too many details to add. In which case it is fine. Nobody is going to be focusing too much on the background when a cute girl is the front and center.
Though I need to work my way up to that point. Luna in various posses. To clear this challenge, I need to focus on just that.
https://youtu.be/6u7MYVmkwyE Render Your Own 360 HDRI in Blender!
Let me watch this.
5:10pm. Right now it is rendering. It is really easy. I just had to set the camera to the right type and hit render.
Maybe I should have used a lower number of samples to start with. It does not matter.
5:25pm. I do not know why, but the nodes seem rounder and there is stretching at the top and bottom. Which is not altogether bad, but now what I was going for. I want the image to be as I've designed it.
Also what is the mirror ball option?
Apart from teh Aspect Ratio you should use RAW Colormanagement instead the "Filmic" Default when using Radiance or you ll end up with a transformed Spectrum.
A little note, the dimension of render output must be 2:1 ex. 1920 : 960 , or 1024 : 512, for avoid distortion
Ah, it needs to be a literal 2:1. I messed up.
5:30pm. Now it is rendering. I took the above advice to heart this time. Good stuff in the comments.
Imagine trying to do this on your own, you'd never get anywhere.
I think I know why they are rounded. There is not enough resolution.
It is one thing to have 1080p in the viewport and quite another in the render. Even though I've gone up to 4k it is not enough. I shuold go up to 8k. Well, it is fine. I'll do another render after this.
5:40pm. No, my computer can't handle this rendering task. At this rate it will take an hour until it is done.
Damn it, why can't I abort this? I guess clicking x on Blender's view was not it.
No, there is some distortion near the top and bottom again. Why is this happening?
5:50pm. I have no idea. Let me try the mirror ball rather than an equirectangular HDRI.
6:05pm. No that is distored as fuck.
https://youtu.be/a48PBPRO8O8 Create Your Own HDR Images with Blender
Let me watch this. Maybe I am just splitting hairs, but I do not see why it should not be possible to get it 100% right.
https://youtu.be/a48PBPRO8O8?t=56
It is important to save it as HDR as that won't just save the color information, it will save the light intensity as well so we can actually use these light sources.
I had no idea. I was wondering about that.
6:15pm. Nope, there isn't anything else I can do. Forget it. I won't split hairs over this issue. I set the resolution properly. Wait, do I also need to set the aspect ratio to 2:1?
No, that is not it. It does not fundamentally change the viewport.
Hmmm, the reason why this might be happening is because of resolution. Things are really stretched near the top and the bottom, so slight pixel differences might result in a significantly different feel.
Ok, let me make my first shot. The sofa with the sky in the backgorund. It feels quite cramped.
6:30pm. I've set up a shot and started the render.
6:35pm. Now my whole system is grinding to a halt from the efford of doing the render. Why is it so slow?
Those low poly stars in the background, and the sofa. It looks incredibly amateurish and not like what I have imagined.
https://blenderartists.org/t/how-do-i-stop-rendering-without-closing-blender/337288/2
It seems I can abort it by pressing esc, but let me leave it while I have lunch.
7pm. I am back. The render looks like shit. The problem is the HDRI - it is way too low res. You can almost see the pixels of the shards in the background. In the original scene you could see they are diamonds, but here it is barely visible. They look round which is absolutely not what I want.
But I suppose this could do as a reference for my first painting.
For the future scene, I am going to have to bring the starfield into the scene. And maybe I'll replace the fog with a surface to lower the computational burden. Volume are hard on the GPU and it would not make that much difference.
7:10pm. I am not going to try to paint right now. Right now is the time to close for the day, but let me just think about this for a while.
What a hard image. Well, there just like 5 features I really need to consider, and they are easily separable.
7:15pm. I see that render options have a time limit. The main difference between the two is the noise threeshold.
7:20pm. Let me make a separate reference that has been denoised. I absolutely do no have an idea how to interpret the light noise right now. Denoising makes things a lot cleaner.
Sigh, what is wrong with the renders. They look worse than what I get in the viewport. I should try to just denoise the first image in the compositor.
7:25pm. Oh, the denoised version is much nicer. I can actually see that the red stuff in the background is a reflection of the sofa.
I am going to give it a try. I'll bring this image into Clip Studio and try tracing over it. I'll do the different aspects in different layers.
My monitor is shitty. When I get up and look at it from an angle I see completely different hues in the background. In CSP I should do some color correction to make things easier to see.
7:30pm. I really meant to do this kind of exercise 2.5 weeks ago, as soon as I finished the first sculpt.
I need to put some skills into doing appealing 2d. Render is really giving me a lot, so I need to give back in turn.
I am going to grind this specific skill and when I am ready, I will move on to doing char models. I'll want to do a chunk of Heaven's Key just to test that skill before I move on to music composition. It will take me a few months before I reach that level.
I understand now why that CG Master guy used planes to generate a desert. Actual procedural stuff is quite slow. With 3d, you need to optimize the render times. The compositor is there for a reason.
7:35pm. Let me close here. Tomorrow, I am going to make the next step."
[MERGE] calendar, google_calendar: Refactoring
TL;DR A bit of magic and ... Pouf ... all virtual events are now real records.
The current implementation of recurring events uses "virtual events" to represents all events in the recurrence. Only one event is stored in the database. All other events are dynamically built and sent to the web client which sees them as real records. This implementation is old, difficult to read (6 years of changes and bug fixes) and has become more and more difficult to maintain. A fresh start would be welcome.
When creating a recurring event, a calendar.recurrence.rule
record should be created.
This model holds the rrule configuration and is responsible to manage events that result
from the rrule.
When a new recurrence is created, all resulting events are also created (stored in the
database). No more virtual events.
To avoid an explosion of events, a maximum of 720 events is created. With 720 events,
a daily recurrence lasts for 2 years and a weekly recurrence lasts for 15 years.
This strategy is used by Google Calendar and seems acceptable in most cases.
A cron job could eventually be introduced to generated more events as the end comes.
This allows to introduce an new rrule end type: 'Forever'. This is actually a shortcut to create a recurrence running for 720 events.
Inspired by Google Calendar, new possibilities are introduced when modifying a recurring event (e.g. change the name, add an attendee):
- Modify only this particular event (the event is still part of the recurrence)
- Modify this and following events (events are still in the same recurrence)
- Modify all events
In a similar way, when updating the rrule of an event (e.g. from every Monday to every Tuesday), the user can choose to:
- Modify this and following events: the recurrence is split. The first part remains unchanged but now ends when the second recurrence begins. The second parts is the updated rrule.
- Modify only this particular event.
- Modify all events: Forbidden (same as Google Calendar)
Note: when events are "moved" because the rrule changed, the events are not actually moved. They are unlinked and new events are created (See "Some design choices explained" section).
Two options were considered.
-
Store the rrule on an event, each event of the recurrence having a Many2one to the parent_id, aka the Master Event of the recurrence.
-
Store the rrule on another model:
calendar.recurrence.rule
. Each event in the recurrence having a Many2one to the recurrence record.
Both options have pros & cons. But there is no clear winner. However the actual business logic of handling the recurrence creation/update would be the same. Where the rrule configuration is stored is the only main difference between both options. And this is probably the easiest part of implementing recurring events.
With that in mind, option 2) is chosen. It allows to clearly separate recurrence logic from the events themselves. It is also the "correct" way of modeling data to avoid many empty columns for most records.
When an rrule is modified, events should also be updated. In most cases, current events are unlinked and new events are created from scratch. Only events exactly at the same time before and after the rrule update are kept. Trying to reuse other events would require an obscure and arbitrary heuristic. (Imagine an rrule every Monday that is changed to every Tuesday and every Friday. What would you do?). This implies that any change to a specific event (name change, attendee added, chatter messages) is lost. This tradeoff seems acceptable as updating an rrule should not be that frequent. Moreover, Google Calendar also works that way so why not Odoo?
On the calendar view, drag and drop an event to shift the entire recurrence.
One way to handle the recurrence shift is to apply the same timedelta to all events. Now events are correctly positioned... except for events that were specifically moved. Those outliers needs special handling. This also introduces some behavior inconsistencies: when an rrule is directly modified, events are not reused, but when the rrule is modified by drag & dropping an event, events are reused. This option needs more code to handle the shift and the behaviors are not consistent.
The chosen option is to find the rrule configuration from the dragged event (this is easy) and update the recurrence with those new rrule values. This brings us back to an rrule update (see above): code reusability yeah; one behavior to rule them all yeah. One downside is that outliers are lost (but Google Calendar also works that way).
This commit refactors calendar synchronization between Odoo and Google after the main calendar application refactoring.
This refactoring takes advantage of two new features from the Google API:
-
New way of synchronizing resources efficiently[1] Incremental sync is performed repeatedly and updates Odoo with all the changes that happened ever since the previous sync. Each time, Odoo provides the previous sync token it obtained from Google and stores the new sync token from the response.
-
Event metadata[2] Ability to set hidden key-value pairs with an event, called extended properties. These extended properties are used to store the related odoo event id and the Odoo owner id (see known limitations)
-
Let A and B be two new users (no tokens available). A creates an event in Odoo and invites B. A is the owner of the event (user_id). Now B authenticates to his Google Calendar account and synchronizes his calendar. We cannot send the event to A's calendar since we don't have any access to his Google Calendar. Hence the event his sent to B's calendar. This leads to data de-synchronisation: The owner is A in Odoo but B in Google. The "real" owner (user A) is stored in the Google event's metadata to be able to reconcile the owner for following synchronizations.
-
Let A and B be two users of Odoo and Google Calendar. And let the Google Calendar of B be private (e.g. if A creates an event in Google Calendar and invites B, B won't see the event in his calendar). If A creates an event in Odoo and invites B. The event is synced to Google Calendar of A. Now B can see the event in Odoo but he can't see it in his Google Calendar.
Task 2126717 PR #42031 PR Enterprise https://github.com/odoo/enterprise/pull/8006
[1] https://developers.google.com/calendar/v3/sync [2] https://developers.google.com/calendar/extended-properties
-- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Signed-off-by: Yannick Tivisse (yti) [email protected]
[HACK] crm: allow ordering on my activities deadline
RATIONALE
Activities are a way to organize our daily pipe. Notably in a sales pipeline salesmen may have multiple leads with activities to perform in the next few days. We would like to be able to have a list view displaying a list of leads with "my" deadline, and to order leads based on this field.
PURPOSE
As activities are linked to records through a one2many and as my activities are only a subset of those activities, it is impossible to store a field on lead model. Indeed it would depend on the current user which makes storing it impossible.
However ordering on a column in list view asks for a stored field. As it is not possible, this commit proposes to hijack the web client and search of lead model in order to allow it.
SPECIFICATIONS
Introduce a activity_date_deadline_my field, computed and searchable that behaves like activity_date_deadline. It is filtered on current user activities instead of being global to the record activities. "My" deadline is the earliest deadline of my activities, even in the past.
Ordering through web client calls search_read with an order parameter set. Search_read then calls search. In this commit we therefore override search to intercept a search without count with an order on activity_date_deadline_my. In that case we do the search in two steps.
First step: fill with deadline-based results
- Perform a read_group on my activities to get a mapping lead_id / deadline Remember date_deadline is required, we always have a value for it. Only the earliest deadline per lead is kept.
- Search leads linked to those activities that also match the asked domain and order from the original search request.
- Results of that search will be at the top of returned results. Use limit None because we have to search all leads linked to activities as ordering on deadline is done in post processing.
- Reorder them according to deadline asc or desc depending on original search ordering. Finally take only a subset of those leads to fill with results matching asked offset / limit.
Second step: fill with other results. If first step does not gives results enough to match offset and limit parameters we fill with a search on other leads. We keep the asked domain and ordering while filtering out already scanned leads to keep a coherent results.
All other search and search_read are left untouched by this commit to avoid side effects. Search_count is not affected by this commit.
As web client order availability is simply based on field being stored we have to allow hijacking its value. A new option 'allow_order' is added that display the order icon in list view column headers. It allows calling search_read with an order based on the column but nothing more. Using it on a not-stored field will give a warning log and ORM ignores it by default.
LIMITATIONS
At least following limitations apply
- search on "my activities" gives a list of ids that is used for searching and ordering. It means that having too much activities on a given user can result in poor performances. -> we consider that activities assigned to a given user should be kept under control. Leads with activities for a given user should be a small subset of leads without activities.
- ordering on activity_date_deadline_my always put those records on the top (deadline asc or desc) whatever the actual ordering of order items given to search. This is done to avoid complex implementation where deadline would be used to order records within groups ordered by another field. -> for example: order = 'priority DESC, activity_date_deadline_my ASC' actually behaves like 'activity_date_deadline_my ASC, priority DESC'.
WARNING
This implementation is a hack. It has been done by professionals. Do not try to do it at home.
More seriously this is hackish and should be avoided. IN our case we consider that the use of activities in sales pipeline is mainly driven by "my activities deadline", which is not necessarily the case with longer processes like tasks.
Moreover user tests tend to show that this feature could be interesting. It will improve quality of Odoo CRM and its adoption by improving its daily use. A framework solution has to be found. Until this is done we keep this hack and hope it is not duplicated in other applications.
LINKS
Task ID 2276011 Prepares Task ID 2243124 (My activities in CRM) PR #52232
Signed-off-by: Thibault Delavallee (tde) [email protected]
[IMP] core: introduce api.ondelete
decorator
With this commit, a new ORM api decorator is introduced:
api.ondelete(*, at_uninstall)
.
This decorator is to be applied to Model methods that check for specific business conditions when attempting to unlink a record via the interface.
E.g. trying to unlink a validated journal entry
This decorator allows this logic to exist outside the BaseModel.unlink
method and is automatically bypassed when in uninstall mode, this means
that during an uninstall any and all data related to a module can and
will be removed easily and cleanly while still being able to apply
business logic to manual deletion of records.
This feature opens the gates to solving a very big problem with uninstalls: records and tables that remain in a database despite the relevant module being uninstalled, because if an override to unlink raises an error, the data will never be deleted from the database.
Henceforth, overrides of unlink shall solely be used for data-cleaning purposes, i.e. deletion or modification of data that is related to the one currently being deleted but cannot be automatically deleted because there are no proper SQL relations.
In certain very specific, low-level scenarios an unlink may be
overridden to raise an error, but this should only be done if you know
what the fuck you're doing, most of the time you'll want to resort to
@api.ondelete
.
Note that this new decorator includes a keyword-only, required argument
called at_uninstall
, in most business cases this argument shall be
False as this argument dictates whether or not this method should be
executed in the unlink
call during uninstall. It should only be set to
True if you are certain of all the implications which most likely means
that the records of the model in which this ondelete function is defined
will NOT be removed during uninstall, they will forever linger in the DB
until manual intervention, this in turn can mean a wide range of
undefined problems due to crap left on the database.
Following commits will replace any unlink
overrides that raise
business errors by methods decorated with api.ondelete
, another commit
will introduce a pylint checker that will raise a warning any time that
an unlink override raises an error.
[IMP] tours: make chrome request a websocket port from the OS
This should be a smarter and properly reliable version of #42071: in that, the runner requests a port, closes it, and gives the port to Chrome. However this apparently turns out to be less reliable than hoped for and the port we just released can immediately be picked up by somebody else (the original PR assumed the allocation of ephemeral ports would be random or FIFO but that may not be the case, especially inside containers).
This uses the same technique of requesting port 0 so the OS allocates one, but it's Chrome requesting & immediately connecting so there should be no race condition possible, and we keep the property that as long as ephemeral ports are available Chrome will be able to open one without conflicts or overlaps.
This leaves the issue of retrieving the port chrome got. Thankfully
it turns out we use a custom user-data-dir in which case Chrome writes
the port it got to $DATA_DIR/DevToolsActivePort
[0]. Despite the
file's name it also contains the path for the devtools endpoint so
we need to only read the first line (rather than be able to read and
intify the entire thing).
Wait up to 10s before giving up entirely, and wait 100ms between each check for the file's existence: on my machine without significant load the file appears after 80 to 150ms, waiting up to 90ms seems ok (it's not like we're in a super hurry as tours tend to be pretty long).
Other paths explored before moc used his eyes and brain and found out about DevToolsActivePort:
- Chrome prints ws URL on the stderr, however because we don't know how much garbage Chrome might send there we need to send it to a continuous sink otherwise Chrome might end up blocking on its stderr because we're not reading from it. This turns out to be a bit of a mess of processes or additional threads.
- xdo suggested we check what ports Chrome listens on using something
like netstat/ss (turns out
psutil
has support for that OOTB), which worked great except on WSL (where it didn't work at all), and the future-proofness was a bit questionable as Chrome might add other servers in the future. - fme suggested using socket activation support[1] and passing in the port we'd opened without closing it, which would really have been ideal, however it turns out it was removed a few months later when chrome added pipes support[2], which was a pain to realize as chrome doesn't exactly do any useful error reporting (so unknown options just disappear into a void to be never seen or heard of ever).
- And while the pipes system[3] has serious positive attributes
(even lower initialization overhead, we could remove the websocket
dependency, also avoids wasting sockets though that's not too much
of an issue here) it would require rewriting a lot more than just
the initialization as it uses its own logical protocol
(NUL-terminated JSON). TBF most of the messaging stuff is properly
contained into just a few
_websocket
methods but still...
[0] https://bugs.chromium.org/p/chromium/issues/detail?id=624837#c4 [1] https://bugs.chromium.org/p/chromium/issues/detail?id=624837 [2] https://chromium-review.googlesource.com/c/chromium/src/+/954405/3#message-ab7415a7db7b94787300d987216e9ce60db47bc2 [3] https://chromium-review.googlesource.com/c/chromium/src/+/954405/3
opw-2378464
closes odoo/odoo#65195
X-original-commit: b679d97a83f1ac898ee0916e92a5b440702bdcdf Signed-off-by: Xavier Morel (xmo) [email protected] Co-authored-by: Xavier Dollé [email protected] Co-authored-by: Christophe Monniez [email protected]
[CHG] core, web: deprecate t-raw
Add a big fat warning when the qweb compiler finds a t-raw
.
t-esc
should now be used everywhere, the use-case for t-raw
should
be handled by converting the corresponding values to Markup
objects. Even though it's convenient, this constructor should never
be made available in the qweb rendering context (maybe that should be
checked for explicitely?).
Replace werkzeug.escape
by markupsafe.escape
in
odoo.tools.html_escape
, this means the output of html_escape
is
markup-safe.
Updated qweb to work correctly with escaping and Markup
, amongst
other things QWeb bodies should be markup-safe internally (so that a
t-set
value can be fed into a t-esc
). See at the bottom for the
attributes handling as it's a bit complicated.
to_text
needed updating: markupsafe.Markup
is a subclass of str
,
but str
is not a passthrough for strings. So Markup
instances
going through would be converted to normal str
, losing their safety
flag. Since qweb internally uses to_text
on pretty much
everything (in order to handle None / False), this would then cause
almost every Markup
to get mistakenly double-escaped.
Also mark a bunch of APIs as markup-safe by default
- html_sanitize output.
- HTML fields content, sanitization is applied on intake (so stripped
by the trip through the database) and if the field is unsanitised
the injection is very much intentional, probably. Note: this
includes automatically decoding bytes as a number of default values
& computes yield bytes, which Markup will happily accept... by
repr-ing them which is useless. This is hard to notice without
-b
. - Script-safe json, it's rather the point (though it uses a non-standard escaping scheme).
- Note that
nl2br
, kinda: it should work correctly whether or not the input is markup-safe, this means we should not need to escape values fed tonl2br
, but it doesn't hurt either.
Update some qweb field serialisations to mark their output as markup-safe when necessary (e.g. monetary, barcode, contact). Otherwise either using proper escaping internally or doing nothing should do the trick.
Also update qweb to return markup-safe bytes: we want qweb to return
markup-safe contents as a common use-case is to render something with
one template, and inject its content in an other one (with Python code
inbetween, as t-call
works a bit differently and does not go through
the external rendering interface).
However qweb returns bytes
while Markup
extends str
. After a
quick experiment with changing qweb rendering to return str
(rather
unmitigated failure I fear), it looks like the safest tack is to add a
somewhat similar bytes-based type, which decodes to a Markup
but
keeps to bytes semantics.
For debugging and convenience reasons, MarkupSafeBytes does not
stringify and raises an error instead (__repr__
works fine). This is
to avoid implicit stringifications which do the wrong thing (namely
create a string "b'foo'"
).
Also add some configuration around BytesWarning (which still has to be
enabled at the interpreter level via -b
, there's no way to enable it
programmatically smh), and monkeypatch showwarning
to show warning
tracebacks, as it's common for warnings to be triggered in the bowels
of the application, and hard to relate to business logic without the
complete traceback.
t-esc
is a bit confusing for the new behaviour of "maybe escape
maybe not", so add a t-out
alias with the same behaviour.
Unlike t-raw
, t-esc
is only soft-deprecated for now: there are
thousands of instances, so editing all the templates is not
great. Eventually we'll add a ci/style
to prevent addition of new
ones, and eventually we might do a bulk-replace and hard-deprecate.
There are a few issues with respect to attributes. The first issue is
that markup-safe content is not necessarily attributes-safe
e.g. markup-safe content can contain unescaped <
or double-quotes
while attributes can not. So we must forcefully escape the input, even
if it's supposedly markup-safe already.
This causes a problem for script-safe JSON: it's markup-safe but
really does its own thing. So instead of escaping it up-front and
wrapping it in Markup, make script-safe JSON its own type which
applies JSON-escaping *during the __html__
call.
This way if a script-safe JSON object goes through markupsafe.escape
we'll apply script-safe escaping, otherwise it'll be treated as a
regular strings and eventually escaped the normal way.
A second issue was the processing of format-valued
attributes (t-attf
): literal segments should always be markup-safe,
while non-literal may or may not be. This turns out to be an issue if
the non-literal segment is markup-safe: in that case when the
literal and non-literal segments get concatenated the literal segments
will get escaped, then attributes serialization will escape
them again leading to doubly-escaped content in attributes.
The most visible instance of this was the snippet_options
template,
specifically:
<t t-set="so_content_addition_selector" t-translation="off">blockquote, ...</t>
<div id="so_content_addition"
t-att-data-selector="so_content_addition_selector"
t-attf-data-drop-near="p, h1, h2, h3, .row > div > img, #{so_content_addition_selector}"
data-drop-in=".content, nav"/>
Here so_content_addition_selector
is a qweb body therefore
markup-safe, When concatenated with the literal part of
t-atff-data-drop-near
it would cause the HTML-escaping of that
yielding a new Markup object. Normal attributes processing would then
strip the markup flag (using str()
) and escape it again, leading to
doubly-escaped literals.
The original hack around was to unescape() Markup
content before
stringifying it and escaping it again, in the attribute serialization
method (_append_attributes
).
That's pretty disgusting, after some more consideration & testing it
looks like a much better and safer fix is to ensure the
expression (non-literal) segments of format strings always result in
str
, never Markup
, which is easy enough: just all str()
on the
output of strexpr. We could also have concatenated all the bits using
''.join
instead of repeated concatenation (+
).
Also add a check on the type of the format string for safety, I think it should always be a proper str and the bytes thing is only when running in py2 (where lxml uses bytestrings as a space optimization for ascii-only values) but it should not hurt too much to perform a single typecheck assertion on the value... instead of performing one per literal segment.
Note: we may need to implement unescape anyway, because it's still
possible to get double-escaping with the current scheme: given an
explicitly escape-ed foo
and t-att-foo="foo"
, foo
will be
re-escaped.
fixup! [CHG] core, web: deprecate t-raw
Added rematches with the Elite 4
Also:
-Made Steven only be fightable in Meteor Falls after the Player has defeated the rival in the postgame.
-Made it so the Player needs to defeat Steven in Meteor Falls to be able to face the Elite 4 again.
-Made Steven replace Wallace from the 2nd run onwards.
-Replaced the preset ball used by TRAINER_CLASS_CHAMPION to Luxury Ball since it fits both Steven and Wallace nicely.
-Tweaked the way in which flags and vars are updated after the postgame rival battle.
-Fixed incorrect VarSet
in GameClear
.
-Since now I technically have 2 different champions, I adjusted my debug preset warps accordingly.
-Changed Wallace's palette for no good reason. It now resembles his look in the Ashnime and BW2/ORAS.
-Made SE_DOOR
only play once after defeating the champion. Dunno why does it play twice normally, but it's weird and it doesn't make sense to me.
-Made the Elite 4 members be unreachable by Match Call until you defeat Steven in Meteor Falls.
Date of creation: Sun Aug 22 09:41:48 2021 -0300
Misc: -Fixed bad cherry-pick merge conflict solution in Route103_EventScript_UpdateFlagsAndVarsAfterPostgameRivalBattle, I'm an idiot. -I clearly wasn't thinking when I originally added 2 to VAR_POKEMON_LEAGUE_RUNS_COUNTER twice per league run, once in GameClear and another one in EverGrandeCity_HallOfFame_EventScript_SetGameClearFlags. Fixed.
Test implemention of potions
I like this better than the first way I did it, which was OOP-based. Specific reasons why:
-
No need to add checks for character/item/feat everywhere, like with target text. In an ECS architecture, the distinction becomes unnecessary. I was wondering what the point of having separate Chara/Item/Feat classes was before, and couldn't really find one.
-
The event implementation actually exists instead of being method-based the first time. It's also typed.
-
It's much better decoupled, and fairly easy to add new game logic with new events/systems/components.
-
The serializer is sane. I really didn't like the serializer I wrote before. The YAML-based one has more convenient features and is well-tested.
-
Dependency injection. I like seeing the implicit dependencies of each class up front, and it's pretty convenient to use in most places. I used to prefer static classes, but really only because what I considered equivalent in Lua weren't static in any sense, so I will have to unlearn that habit.
Things I don't like:
-
Interruption of events. I'm using the provided HandledEntityEventArgs, but you have to remember to check
args.Handled
everywhere. Maybe this is better than letting the engine handle it? -
Ordering of events. You can only order event handlers based on the EntitySystem that contains them. This means you can't order event handlers inside the same system, and are forced to split them up between multiple systems if you want ordering. I would probably use (Type, string) tuples instead. Also, ordered event handlers are topologically sorted every time they're triggered.
-
Inability to register more than one event handler per event/component pair. I'm wondering if there's any sort of technical/performance reason for this in Robust.
-
Inability to register a local event handler that passes in the UID of the target entity, but doesn't care about components. The only options are (uid, component, event) or (event). Is the way around this to add a UID field onto the event?
-
Ergonomics of EntityUid versus Entity. Entity does hide the implicit IEntityManager dependency. It's also rather convenient, but having two ways of querying entity state is confusing. I've heard that using UIDs is faster than using Entity, but is that because Entity was an interface subject to unboxing penalties before? Also, do we need all the extra performance at this point in time? Having to do a Resolve() or TryGetComponent() just to get an entity's position is really painful. Maybe playing to Robust's strengths in this case means passing MapCoordinates around, to make querying for a SpatialComponent unnecessary? Then again, it's really only the SpatialComponent/MetaDataComponent that are this commonly used.
-
IoC dependencies outside of EntitySystems and managers - for example, inside of the current Effect class. There is no avoiding the fact that IoC dependencies will be needed in many different places, so having a way to inject them outside of EntitySystems would be very useful instead of having to call Resolve<>() everywhere. Unfortunately, storing pointers to IoC dependencies on Effect increases their memory usage times every entity holding them. This could be solvable if Robust's serializer supported flyweighting, but it doesn't currently.
-
Using Love means having ineffective dependency injection for anything Love-related. Is the only way around this really to be insane enough to implement an entire custom graphics backend with the proper injectable interfaces and pass graphics handles around? Making the C API for Love is probably going to become a requirement at some point, so I could add a headless mode to its C# binding if it gets done.
-
OOP IMap versus IMapManager. It's awkward to not be able to operate on maps as objects, but querying entities on maps is a frequent ocurrence, and that requires an IEntityManager to be available.
-
YAML. I hate YAML with a burning passion since it's annoying to edit with Vim/macros and has significant whitespace. At least XML can be structurally edited with a good editor and has schema and XPath support, which YAML has neither of. I might just have to live with it, though.
-
BMP resource caching. We need BMP support to be able to use vanilla's assets by downloading them automatically, and we would need BMP support anyway if instead we were to convert all of them to PNG beforehand. Robust does this thing where they put a .yml file in the image's directory with texture information. I think this is actually a better idea than what I was doing before with BMP key colors, since prototypes shouldn't care about those things.
-
Other resource caching. Unfortunately, since Love's resource types like Font require arguments like the font size to use upfront, they can't be used with the current IResourceCache.
Unsolved questions:
-
Game save/instantiated map serialization? Robust doesn't support this usecase, at least for its flagship title. Using the SerializationManager for everything serialization-related is a tempting option. I'm wondering how private/public fields will be distinguished. Also, will adding binary serialization support even improve anything this time? I keep assuming "binary format = good".
-
Containers? Having EntityUids makes this much easier than storing Entities, at least.
-
Liveness? How does
isAlive = item.amount > 0
get modeled? -
Stacking? How do non-stacking entities get consumed for things like magic? Probably a question for a future StackingSystem.
-
Verbs? ON/Love had tons of events like
on_bash
,can_bash
,on_activate
,can_activate
,on_descend
,can_descend
... Should these all be separate events, or rolled into some kind of Verb class? The latter sounds like a miniature stringly-typed event system embedded into the larger typed one. -
Mods? How will Harmony work? Is Harmony even necessary for most things anymore? Where do things like overridable formulas go? How will mods be able to rearrange EntitySystem event handlers? What about optional mods, since event ordering depends on types to work, meaning all the assemblies have to be loaded?
-
Entity creation arguments/results? How will setting
nostack
and passing in extra components work? Also, right now a failed entity creation returns null. Is using a Result type better for debugging purposes, or is it too heavyweight? If only C# had tagged unions...
ahead-behind: do not die when we see no INTERESTING pending object
We currently die if we are fed an ahead/behind with zero
objects (foo..foo
in the most basic case, but in practice
something like foo@{upstream}..foo
, when foo
has just
been merged). The problem is that we let
handle_revision_arg
parse it, and then pick the pieces out
of the pending object list. So "^foo" looks no different to
us there than "foo".
This patch hacks around it by picking up the UNINTERESTING object in that case. However, this isn't great because:
-
Now we won't notice some types of bogus input.
-
We end up reporting the name of the UNINTERESTING object.
We probably should pick apart the ".." ourselves, or even just change it to ":" or whitespace.
Signed-off-by: Jeff King [email protected]
Adding article: Man killed in front of his 3 kids, girlfriend in potential Christmas Eve road rage shooting (61c8e5fbdb916eb1f48dca84)
bitch ass last commit motherfuckker be adding unnecesary files