#GitHub #GitHubPages #fail This is driving me madâŚ
Images randomly deciding not to load on all my pages.
Is it just me? Is it my browserâs fault? Is it just in Brazil?
I was working on this #shapely + #trimesh page⌠and I can only see the last image (the animated gif)!
https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/shapely-e-trimesh.html
#GitHub #GitHubPages #fail This is driving me madâŚ
Images randomly deciding not to load on all my pages.
Is it just me? Is it my browserâs fault? Is it just in Brazil?
I was working on this #shapely + #trimesh page⌠and I can only see the last image (the animated gif)!
https://abav.lugaralgum.com/material-aulas/Processing-Python-py5/shapely-e-trimesh.html
Update: On this exact page I have bungled the image URLs (I blame Marktext for being stupid and not using a relative reference). But I swear loading problems have been going on other well formed pages.
This is your friendly reminder that you could be making #PaperObjects with #Python and #py5, you know?
https://github.com/villares/Paper-objects-with-Processing-and-Python/
(Mind you that GitHub images are mostly failing to load here today for some unknown reason)
If you like this, support my work:
https://www.paypal.com/donate/?hosted_button_id=5B4MZ78C9J724
https://liberapay.com/Villares
https://wise.com/pay/me/alexandrev562
#Processing #CreativeCoding
@lyse@lyse.isobeef.org I do my timetracking in a little Python script, locally. Every now and then, I push the data to our actual service. Problem solved â but itâs a completely unpopular approach, they all want to use the web site. I donât get it. Then, of course, when itâs down, shit hits the fan. (Luckily, our timetracking software is neither developed nor run by us anymore. Itâs a silly cloud service, but the upside is that Iâm not responsible anymore. đ¤ˇ)
Some of our oldschool devs tried to roll out local timetracking once, about 15 years ago. I donât remember anymore why they failed âŚ
This is developed inhouse, Iâm just so glad that weâre not a software engineering company. Oh wait. How embarrassing.
Oh to be anonymous on the internet. That must be nice. đ
Anyone that the Pigs donât like sure is the perfect candidate. Without fail.
@kat@yarn.girlonthemoon.xyz UPDATE: getting it to run natively through a VM and other means all failed! so i did the cursed thing and tried the windows installer in wineâŚ..
@kat@yarn.girlonthemoon.xyz oh and the logs say âfailed to write msg: use of closed network connectionâ WHAT DOES THAT MEAN
Even though I really do like the shell, I always use Dolphin to mount my digicam SD card and copy the photos onto my computer. I finally added a context menu item in Dolphin to create a forest stroll directory with the current date in order to save some typing:
The following goes in ~/.local/share/kservices5/ServiceMenus/galmkdir.desktop:
[Desktop Entry]
Type=Service
X-KDE-ServiceTypes=KonqPopupMenu/Plugin,inode/directory
Actions=Waldspaziergang;
[Desktop Action Waldspaziergang]
Name=Heutigen Waldspaziergang anlegenâŚ
Icon=folder-green
Exec=~/src/gelbariab/galmkdir "%f"
In order to update the KDE desktop cache and make this action menu item available in Dolphin, I ran:
kbuildsycoca5
The referenced galmkdir
script looks like that:
#!/bin/sh
set -e
current_dir="$1"
if [ -z "$current_dir" ]; then
echo "Usage: $0 DIRECTORY" >&2
exit 1
fi
dir="$(kdialog \
--geometry 350x50 \
--title "Heutigen Waldspaziergang anlegen" \
--inputbox "Neues Verzeichnis in â$current_dirâ anlegen:" \
"waldspaziergang-$(date +%Y-%m-%d)")"
mkdir "$current_dir/$dir"
dolphin "$current_dir/$dir"
This solution is far from perfect, though. Ideally, Iâd love to have it in the âCreate Newâ menu instead of the âActionsâ menu. But that doesnât really work. I cannot define a default directory name, not to mention even a dynamic one with the current date. (I would have to update the .desktop file every day or so.) I also failed to create an empty directory. I somehow managed to create a directory with some other templates in it for some reason I do not really understand.
Letâs see how that works out in the next days. If I like it, I might define a few more default directory names.
Sometimes, we spend months stuck in inertia, distracted by screens and routine. So Iâd like to give you a simple reminder: creating-in whatever form-is what makes you feel alive.
The beauty of working on projects is not in their âsuccessâ, but in the simple act of working on them. Whether itâs writing, cooking, programming or redecorating the house: play with ideas without pressure, engage in an activity to test, fail and discover without judgement.
In the end, what remains is not a perfect product, but the satisfaction of completion and valuable lessons.
Find a project, no matter how small, and let it take you without expectations.
@prologic@twtxt.net, from IRC:
- Saving preferences is failing. Specifically trying to save âOpen Linksâ on the same window. For sure it isnât happening. Check errors on browserâs console.
- Search results pagination is broken. Search for âtwtxt.netâ and see it. Also, picking oldest/newest makes no difference on that search query.
This is an example of what I believe every SRE should master and whatever Post Incident Review (PIR) should focus on. Where did the system fail. What are the missing or incomplete Safety Controls.
Dang it, first attempt failed:
Somehow, my local feed cannot be opened to append to. I reckon, I have to resolve the tilde first:
@kat@yarn.girlonthemoon.xyz Using full-blown Cloud services is good for old people like me who donât want to do on-call duty when a disk fails. đ I like sleep! đ
Jokes aside, I like IaaS as a middle ground. There are IaaS hosters who allow you to spin up VMs as you wish and connect them in a network as you wish. You get direct access to all those Linux boxes and to a layer 2 network, so you can do all the fun networking stuff like BGP, VRRP, IPSec/Wireguard, whatever. And you never have to worry about failing disks, server racks getting full, cable management, all that. đ
Iâm confident that we will always need people who do bare-bones or âlow-levelâ stuff instead of just click some Cloud service. I guess that smaller companies donât use Cloud services very often (because itâs way too expensive for them).
i love everything pico.sh i wish i had more of a use for their services but the paste service is SUPER handy omg i finally had a reason to use it (to send a friend my unfinished failed marvel API bash program lol) and itâs epic. i love SSH i love TUI apps they are the best
To me it appeared that the failed attempts to ban NPD in the past actually helped them gain more supporters.
What makes AfD stronger for sure is just going âlol nah weâre not even going to tryâ:
https://www.tagesschau.de/inland/innenpolitik/afd-verbot-antrag-100.html
If they donât try, then it means that âit canât be that bad, itâs just a normal partyâ, right? đĄ
Amd of course, TDD! I tried that, but it doesnât work all that great for me in its strict form. I have the feeling that coming up with a single new failing test, making it pass, maybe some refactoring, rinse and repeat wastes significantly more time than doing it in â what they call â the âbundleâ approach. Coming up with several tests in advance and then writing the code or vise versa is usually much quicker. I do find that more enjoyable, it also helps me to reduce smaller context switches. I can focus on either the tests or the production code.
As for the potentially reduced code coverage with a non-TDD approach, I can easily see which parts are lacking tests and hand them in later. So, thatâs largely a specious argument. Granted, I can forget to check the coverage or simply ignore it.
I agree with John, TDD results in less elegant code or requires more refactoring to tidy it up. Sometimes, itâs also not entirely clear at the beginning how the API should really look like. It doesnât happen often, but it does happen. Especially when experimenting or trying out different approaches. With TDD, I then also have to refactor the tests which is not only annoying, but also involves the danger of accidentally breaking them.
TDD only works really well, if you have super tiny functions. But we already established that I typically donât like tiny methods just for the purpose of them being extremely short.
When fixing a bug, I usually come up with a failing test case first to verify that my repaired code later actually resolves the problem. For new code, it depends, sometimes tests first, sometimes the productive code first. Starting off with the tests requires the API to be well defined beforehand.
Na, youâre spot on, @movq@www.uninformativ.de! The result is an expected, terrible disaster. It just seems the absolute catastrophy is delayed for another four years.
Even though Iâm the last one who wouldnât be glad about banning the nazis, Iâm not a fan of banning parties in general. I believe that a healthy democracy has to withstand extremists. Whether itâs still healthy is debatable. To me it appeared that the failed attempts to ban NPD in the past actually helped them gain more supporters.
The big established parties are all bad traitors. I blame them and their actions to help raise AfD. They just give a fuck about the ordinary people, theyâre only concerned about their private gain and power. I bet nothing will change, to the contrary, it will only get worse. The winners do have the chance to turn it for the better, but they just will not. No way, unfortunately.
But then, we must not forget that people are just dumb and stupid, too. Also, that wonât change. AfD wonât help these idiots either, but they still vote for them. I also donât understand how there is still so much support for the other big parties left. Education is important. Very important. But I have the impression that weâre lacking it.
1/4
to mean "first out of four".
@bender@twtxt.net I try to avoid editing. I guess I would write 5/4, 6/4, etc, and hopefully my audience would be sympathetic to my failing.
Anyway, I donât think my eccentric decision to number my twts in the style of other social media platforms is the only context where someone might write Âź not meaning a quarter. E.g. January 4, to Americans.
Iâm happy to keep overthinking this for as long as you are :-P
@lyse@lyse.isobeef.org on this:
3.2 Timestamps: I feel no need to mandate UTC. Timezones are fine with me. But I could also live with this new restriction. I fail to see, though, how this change would make things any easier compared to the original format.
Exactly! If anything it will make things more complicated, no?
@prologic@twtxt.net Correct⌠epic fail 𤣠Been a long day and I just wasnât thinking, nor backing up properly. Oops indeed. My usual errors still exist though.
Todayâs project: Put 2 failing hard drives in RAID 0 and boot from it. What could go wrong?
@mckinley@twtxt.net I have a custom .tmux.conf
that makes it very easy to use the multiplexer, but I agree, Zellij seems pretty robust, and intuitive. I like it! Tried compiling it, as with everything Rust, it failed miserably. Good thing there is a binary release I could download to try!
@bender@twtxt.net ha! He goes his âpoemâ:
A string of letters, a forgotten name,
An email crafted, a message to claim.
We hit send with a click, a hopeful sigh,
But a bounce-back arrives, a tear in our eye.âDelivery failed,â the message reads cold,
The address it seems, is a story untold.
A ghost in the system, a memoryâs trace,
Lost in the void of cyberspace.
:-D
$name$
and then dispatch the hashing or checking to its specific format.
Here is an example of usage:
func Example() {
pass := "my_pass"
hash := "my_pass"
pwd := passwd.New(
&unix.MD5{}, // first is preferred type.
&plainPasswd{},
)
_, err := pwd.Passwd(pass, hash)
if err != nil {
fmt.Println("fail: ", err)
}
// Check if we want to update.
if !pwd.IsPreferred(hash) {
newHash, err := pwd.Passwd(pass, "")
if err != nil {
fmt.Println("fail: ", err)
}
fmt.Println("new hash:", newHash)
}
// Output:
// new hash: $1$81ed91e1131a3a5a50d8a68e8ef85fa0
}
This shows how one would set a preferred hashing type and if the current version of ones password is not the preferred type updates it to enhance the security of the hashed password when someone logs in.
https://github.com/sour-is/go-passwd/blob/main/passwd_test.go#L33-L59
In this House â We might fail, but never with abandon â Every moment is fresh, unimpeded by the one before â We remove as many obligations as we add â There is something to protect, something to give everything for â Tsuyoku Naritai!
of course the Soviet Union failedâthey didnât have computers yet!
(cont.)
Just to give some context on some of the components around the code structure.. I wrote this up around an earlier version of aggregate code. This generic bit simplifies things by removing the need of the Crud functions for each aggregate.
Domain ObjectsA domain object can be used as an aggregate by adding the event.AggregateRoot
struct and finish implementing event.Aggregate. The AggregateRoot implements logic for adding events after they are either Raised by a command or Appended by the eventstore Load or service ApplyFn methods. It also tracks the uncommitted events that are saved using the eventstore Save method.
type User struct {
Identity string ```json:"identity"`
CreatedAt time.Time
event.AggregateRoot
}
// StreamID for the aggregate when stored or loaded from ES.
func (a *User) StreamID() string {
return "user-" + a.Identity
}
// ApplyEvent to the aggregate state.
func (a *User) ApplyEvent(lis ...event.Event) {
for _, e := range lis {
switch e := e.(type) {
case *UserCreated:
a.Identity = e.Identity
a.CreatedAt = e.EventMeta().CreatedDate
/* ... */
}
}
}
Events
Events are applied to the aggregate. They are defined by adding the event.Meta
and implementing the getter/setters for event.Event
type UserCreated struct {
eventMeta event.Meta
Identity string
}
func (c *UserCreated) EventMeta() (m event.Meta) {
if c != nil {
m = c.eventMeta
}
return m
}
func (c *UserCreated) SetEventMeta(m event.Meta) {
if c != nil {
c.eventMeta = m
}
}
Reading Events from EventStore
With a domain object that implements the event.Aggregate
the event store client can load events and apply them using the Load(ctx, agg)
method.
// GetUser populates an user from event store.
func (rw *User) GetUser(ctx context.Context, userID string) (*domain.User, error) {
user := &domain.User{Identity: userID}
err := rw.es.Load(ctx, user)
if err != nil {
if err != nil {
if errors.Is(err, eventstore.ErrStreamNotFound) {
return user, ErrNotFound
}
return user, err
}
return nil, err
}
return user, err
}
OnX Commands
An OnX command will validate the state of the domain object can have the command performed on it. If it can be applied it raises the event using event.Raise() Otherwise it returns an error.
// OnCreate raises an UserCreated event to create the user.
// Note: The handler will check that the user does not already exsist.
func (a *User) OnCreate(identity string) error {
event.Raise(a, &UserCreated{Identity: identity})
return nil
}
// OnScored will attempt to score a task.
// If the task is not in a Created state it will fail.
func (a *Task) OnScored(taskID string, score int64, attributes Attributes) error {
if a.State != TaskStateCreated {
return fmt.Errorf("task expected created, got %s", a.State)
}
event.Raise(a, &TaskScored{TaskID: taskID, Attributes: attributes, Score: score})
return nil
}
Crud Operations for OnX Commands
The following functions in the aggregate service can be used to perform creation and updating of aggregates. The Update function will ensure the aggregate exists, where the Create is intended for non-existent aggregates. These can probably be combined into one function.
// Create is used when the stream does not yet exist.
func (rw *User) Create(
ctx context.Context,
identity string,
fn func(*domain.User) error,
) (*domain.User, error) {
session, err := rw.GetUser(ctx, identity)
if err != nil && !errors.Is(err, ErrNotFound) {
return nil, err
}
if err = fn(session); err != nil {
return nil, err
}
_, err = rw.es.Save(ctx, session)
return session, err
}
// Update is used when the stream already exists.
func (rw *User) Update(
ctx context.Context,
identity string,
fn func(*domain.User) error,
) (*domain.User, error) {
session, err := rw.GetUser(ctx, identity)
if err != nil {
return nil, err
}
if err = fn(session); err != nil {
return nil, err
}
_, err = rw.es.Save(ctx, session)
return session, err
}
@movq@www.uninformativ.de, is removing the hash from the body of the twt on the TODO? I read it, but I am unsure if it is there already, or not. đ Sorry if it is, and I failed to spot it!
Not to boast, but jenny
has never failed me đ. It is so neat, powerful, and streamlined, not even funny! Thank you very much, @movq@www.uninformativ.de for it! đ
@lyse@lyse.isobeef.org awesome! i love failing test cases. Do you have them pushed up on a branch to check out?
@thewismit@twtxt.psynergy.io @jlj@twt.nfld.uk in old school terminal jargon the ^H means control H or the sequence used in some terminals to indicate backspace. The âjokeâ is that the term failed to interpret it correctly and you can see the partially typed word before they changed it.
IRC RT: The internet is nothing but a failed culture amplifier.
When all fails, rm ./package-lock.json
and try again
I genuinely wonder how many times Iâll try and fail to host my own VCS yet. The counter is at 3 or 4 now.
As FreeBSD fails as a technical project, it is still good comedy.