draft0

Menu

Entries tagged 'cat:Projects'

SBWG 0.10.11

It's been two months since I published a new version of SBWG (and therefore since I worked enough on it to make me feel that an increase in the version number may be justified). I hardly get around to working on it, lately. But when I do, I try to make some solid small steps towards the improvements I wish do be done to SBWG.

So, now there is a new version (0.10.11) but I haven't published it yet because before I do I want to test it a bit more when I'm not as fucking tired as I am right now. Writing this entry could actually be considered part of the testing that I still want to do. But as I said, I'm fucking tired right now. So I'll continue this entry another time.

Edit 2022-09-12: I did some tests with fake content offline and feel confident that I fixed more than I broke in this version. I'll add it to the project page soon.

Two long procrastinate areas that have been overdue to get fixed for a while now are permanent caching and parallelisation. For permanent caching, the bugs that I found are fixed. Aggressive caching with option `--cache` (`-C`) works and it certain groups can be selected (excluding others) for permanent caching. In my test this speeds up everyday web site re-generations by up to 100%. But it also means the user has to be aware of the cache files that persist after SBWG is done and will be used the next time. Changes to existing entries will not take effect without removing the relevant cache files. For parallelisation, the bugs that I found and that affect the generated HTML are fixed. I still consider parallel mode to be experimental. Sometimes messages on stdout are weird or cut off. But who used very verbose mode and looks at every message anyway? Parallelisation is functional and usable is what I mean to say. In my test on a Core i5 with 4 cores (8 threads) it speeds up everyday web site re-generation by around 380% with default settings. It depends a lot on how much of web site generation is generating thumbnails and other image sizes of file attachments or gallery images. Those aren't sped up that much because the CPU already is the bottleneck for those. HTML file generation profits more from having more parallel threads than CPU cores (or threads) running.

Comment via email

Fred - Part 2 - The Case Lid And Cooling

This entry is a reply to or continuation of the entry 'Fred - Part 1 - Modding The Quiet Into A Server Rack Case'.

In this entry I'll describe how Fred's components are air cooled.

So, after removing the fan wall and unplugging the two fans in the back of the case there was no active cooling left. That's good for reducing noise, but not enough cooling for the hard drives, the CPU and the SAS controller cards. Since the case is not mounted in a rack and nothing is placed on top of it, I decided to use the space in the case lid to place larger fans.

The CPU

My idea was to replace the CPU cooler with a larger one that just fits into the case and have a fan above it suck out its hot air (also pulling in ait from the RAM modules next to the CPU socket). I fount a heat sink from Scythe called Iori (SCIOR-1000). Mounted on the socket there would be just enough space for a 15 mm fan above it. As it turns out though, the heat sink is large enough to cool the CPU passively and the RAM doesn't need any additional cooling, too. So the fan above it is not even plugged in.

The Extension Cards

Since the HBA and the RAID card that I'm using are designed for servers with a proper airflow, they need at least some additional cooling. Their heat sinks are quite small for the amount of heat they produce. But there was enough room above them to place a fan that sucks the hot ait directly from the extension card area out of the case. I was told these cards usually don't have any problems getting extremely hot. But I rather don't want to have them do their things for hours or days streight without any active cooling. Replacing their heat sinks with larger ones would only be a sufficiant option if there was room for much much larger heat sinks.

The Hard Drives

I don't want to have have hard drives run continuesly without any active cooling, especially when they are sitting in enclosures that don't allow for any aitflow without some amount of pressure. There is just no-where for the heat to go on its own in these tight drawers. I decided for three 140 mm fans that would neatly in a row behind the hard drive compartment and backplane. Since the motherboard isn't that large, there was nothing but a few cables in that area of the case. I've mounted an aluminium bar that I had lying around and tucked two pieces of flat plastic between this bar and the bar that originally held the fan wall at the bottom. That way, the air that is pressed in from above gets directed only into the hard drive compartment where it has no way to escape without passing the hard drives.

Unfortunately the room around the hard drives is so small that quite a lot of air preassure is needed to cool them as much as I wanted to. Running the fans at full speed all the time is hardly enough to keep them at a temperature that I deem acceptable. I tried to increase the cooling effect by sealing all the edges and other tiny spaces where some air could escape without cooling the hard drives. But this didn't lead to a measurable difference. I ended up taking out two of the 16 hard drives to increase the size of the duct. I chose two drives in the centre so that there now is a large surface where the air cools the remaining drives. That lowered the temperatures of the surrounding drives a lot. The temperature of the drives at the edges was of course hardly effected. But those weren't the problem anyway.

I'll probably continue about the rest of the case mod in a followup entry.

File Attachments

Making the holes for the fans was easier than I expected_ I marked the borders with a pencil by following the outlines of the actual fans, cut the rough holes with an angle grinder with a cutting disk, then did the finishing with a rotary tool (a not Dremel)_
Making the holes for the fans was easier than I expected. I marked the borders with a pencil by following the outlines of the actual fans, cut the rough holes with an angle grinder with a cutting disk, then did the finishing with a rotary tool (a not Dremel).
I used up several cheap grinding bits for the finishing_ The remaining borders between the fas are only a few millimeters wide_ But the ~2 mm thick steel holds up surprisingly well_ They don't make regular home computer cases from that material_
I used up several cheap grinding bits for the finishing. The remaining borders between the fas are only a few millimeters wide. But the ~2 mm thick steel holds up surprisingly well. They don't make regular home computer cases from that material.
First coat: primer, second coat: matte black, thirdly added sparkly sprinkles_ In the picture I started taping the sides for what comes next_
First coat: primer, second coat: matte black, thirdly added sparkly sprinkles. In the picture I started taping the sides for what comes next.
Then I painted the middle part pink_ After the tape was removed I noticed the paint came off in one spot_ Well, that's how it goes if you don't do it right_ I can just cover this with a sticker_ For now I just added a matte clearcoat_
Then I painted the middle part pink. After the tape was removed I noticed the paint came off in one spot. Well, that's how it goes if you don't do it right. I can just cover this with a sticker. For now I just added a matte clearcoat.
In between cooling systems_ I tested the modded lid as it was in the picture but closed_ It did do something and it was better than the open case with scattered fans in the next picture, but not by much_
In between cooling systems. I tested the modded lid as it was in the picture but closed. It did do something and it was better than the open case with scattered fans in the next picture, but not by much.
That's how it looked for a day while I used the NAS before finishing the new cooling system_ Notice the large space in the middle_ That will be used in the next pictures_
That's how it looked for a day while I used the NAS before finishing the new cooling system. Notice the large space in the middle. That will be used in the next pictures.
This is how the case looked inside now_ (I'll write about the power supply in the next entry_)
This is how the case looked inside now. (I'll write about the power supply in the next entry.)
And from the outside_ The fan on the bottom right cools the RAID card and the HBA_ I don't know if it's cooling it enough because I don't know what the cards/processors are made to withstand_ But they still ran a few years after that picture was taken_ The CPU fan is off because it stays cool enough during a hours-long burn test_
And from the outside. The fan on the bottom right cools the RAID card and the HBA. I don't know if it's cooling it enough because I don't know what the cards/processors are made to withstand. But they still ran a few years after that picture was taken. The CPU fan is off because it stays cool enough during a hours-long burn test.
The cooler mount wasn't made for that socket_ I think it was for an AMD socket_ The bracket was really strong and tight and eventually broke in two_ The CPU lid didn't take any damage though and I simply used a few zipties to hold the cooler in place without much preasure on the CPU_ That still was enough to cool the CPU passively and the machine ran three quarters of a year that way_
The cooler mount wasn't made for that socket. I think it was for an AMD socket. The bracket was really strong and tight and eventually broke in two. The CPU lid didn't take any damage though and I simply used a few zipties to hold the cooler in place without much preasure on the CPU. That still was enough to cool the CPU passively and the machine ran three quarters of a year that way.
Eventually I made my own bracket (not in the picture) and now that is held down by zipties_ It's quite sturdy_
Eventually I made my own bracket (not in the picture) and now that is held down by zipties. It's quite sturdy.
Comment via email

Fred - Part 1 - Modding The Quiet Into A Server Rack Case

Fred is an old Supermicro rack server that I got as an attempt at building a NAS that replaces all the smaller NASs that I already had. But I like to collect stuff and it's never going to be enough. So it ended up being just another extension of my home network.

Overview

It's an old 3U Supermicro server case with 16 3.5" hard drive drawers, a good but not too bulky Asus motherboard and a nice low-power Intel CPU. I kept the motherboard, CPU and 32 GB ECC RAM. It's more than enough.

I wanted to do some mods on the case though to make it more comparible to my home and my visual taste in computer cases. In short, what I did was: Switch the PSU to a quieter one, build fans into the lid for quieter drive and card cooling, painted the case, switched the CPU cooler for passive cooling, added two HBA cards and 14 8 TB hard drives (two drawers left intentionally free).

I will tell about/may document these mods in more detail in separate entries.

File Attachments

The case before I started (but not before I added some stickers)
The case before I started (but not before I added some stickers)
The pretty much finished case
The pretty much finished case
Comment via email

BLucid

I would like to tell the story about that time I co-founded and hosted a podcast for a few short years. But not today. This here is just to remind me.

Edit: Well, I'll just tell it real short then. I wanted to start a podcast in German language about lucid dreaming because there weren't any. But I wouldn't have done it alone, so I asked around, Zitrom joined and we recorded some episodes. We called the project BLucid because that sounded cool. He also made the intro jingle that I still like very much. Eventually I started to record episodes with others instead when Zitrom wasn't available anymore.

At some point I didn't find anybody who would join me for new episodes and so the project died. After a few years of me not having any time for that any more anyway, I decided to cancel the domain and take the site offline.

Now I'm re-publishing the podcast episodes on draft0.de.

And maybe eventually I will find somebody to co-host the podcast again. Some day. Feel free to send me a note if you'd like to be in the podcast, in German or English.

Comment via email

SBWG 0.10.10

I decided to publish a new version of SBWG. I hardly got around to editing it in the last few months. So it doesn't really contain the new things that I had for a while intended for v0.10.10. But there were a few bugs that I wanted to have fixed in the latest published version. There still are known bugs. But now there are a few less.

Well, since it doesn't really contain anything new that's relevant, I didn't have to create this entry. But I did, so I'll use it to say I also fixed the RSS feed of draft0 and the menu link of steephlog on mobile. Bugs that I didn't know I had introduced in the last update and that were very happy that I didn't test things beforehand.

The things that did change since my last SBWG update just aren't that interesting. But I'll list some here, nevertheless: Entries can no have custom notes (using the 'note:' tag; Topic tagpages now also show the author names of entries; Srickied entries are now excluded from the RSS feed because they're jsut used as notices at the top of tagpages and don't belong context-less in the feed (there is a better solution planned); Error reporting inside opf the script now includes information on the basis of which the clean-up routine can decide how to handle things differently for different errors and stuff; SBWG now locks directories; There is now a flag that hides attachments to an individual entry that are of a specific mime type, and, you could just read the CHANGELOG file instead of this if you really are interested in these little changes.

It'll probably continue to be slow in the foreseeable future. There are a lot of ideas in my head and several bugs in the code and probably vice versa. But time… not so much.

Edit: Oh, and another thing: I started to test updates and changes that I made to SBWG live on this web site because it's more fun if something breaks every other day.

Comment via email

Looking for a 286 operating system

I got myself a 286. A small tower PC made from collected parts from here and there, a clock display and turbo button, but a motherboard that doesn't seem to have a turbo mode. An MFM hard drive, Mitsumi CD-ROM drive, two floppy drives, a VGA card, IO card, a damaged case. It looks like I could have built it from parts I found here and there. I reckon that's how it was built. It's the first working 286 that I had since I so stupidly through out my IBM PS/2 Model 30. Well, it wasn't that stupid at the time. It was a conscious decision. But anyway. The only other time I had a 286 board was when somebody gifted me their old PC because it was both worthless and broken. The CMOS battery had leaked and I didn't know enough about electronics to make it work, had nobody to ask and internet wasn't really a thing back then.

I had been looking for a specific model before: A Peacock 286 desktop. But Not only didn't I find one for sale so far, I'm pretty sure it would cost more than I'd be willing to pay for a vintage PC just so I could own the same PC model that was the first computer I ever used (for homw work in first grade). The first computer I had contact with was an Olympia People. I didn't even look for one of these because it would be a serious collector's piece and be respectively priced.

So I got just any working 286 PC; just to fill the gap in what I therefore should now start to call my collection of vintage hardware. It just happened to be one with a working MFM hard disk. As if I didn't already have enough unfinished and unstarted projects now I even payed money to buy me another one. Because now I have to do something with this machine, obviously. I bought it weeks ago and it's getting bored.

I thought about what OS I might want it to run. MS DOS would be the obvious choice. Too obvious for my taste. CP/M after that. But that's too similar. I want something different. But I don't even know what other systems exist that run on a 286. Linux should be out. (Although I haven't yet looked if somebody has made some part of the kernal work on a 286. I doubt it though. No extended mode, no multitasking.) IBM AIX wasn't available for the 286 models either. Are there other Unix clones or versions that run on a 286? Of course there are. I just don't know them. Prologue comes to mind. And Xenix. What others are there? Which one should I try? I could test MikeOS on it.

Comment via email

PIN Changer

I had to change the default PINs of over 200 SIM cards once. And such a situation could arise again. So I've built a PIN changer in which I just have to insert the card, wait a few seconds and it's done.

The Card Slots

SIM cards in their natural form factor aren't as fiddly to handle as they are in the form factors most people know, which is Mini SIM, Micro SIM and Nano SIM. Classical SIM cards are the same size as other smart cards. I found a card slot with an end switch on eBay. I like it when I find industry grade parts for cheap on eBay as part of some remaining stock. Additionally I've used a slide-in mini SIM slot and another, separate end switch from my parts collection in case I to change the PINs of smaller cards.

The Baseband Processor

Other parts that I've used is an Arduino Nano sized Arduino Nano nearly-clone and an A6 modem module. There are many similar modem modules designed around different but similar ICs. Many of them are cheap and widely used for DIY IoT projects. So example code for the Arduino and other help can be easily found on the web. I don't know why I went with a module with an A6. But it works fine and there are an Arduino library for it as well as cheap modem modules with it available.

(tba:voltage supply)

The Controller

Yes, Arduino may be kind of the noob go-to board and could look up how to use microcontrollers on their own finally and even if I don't want to I could finally start to use ESP32s like everybody else. But I know Arduinos and by now I'm familiar with it and it works, so, whatever. Arduino Nano is kind of my go-to form factor now because they have integraded USB, are Uno compatible and small. Unless I need more or something very specific I use Arduino Nano almost-clones with USB-C port.

The Code

The code is a real mess. It had been a long time since I had written any even halfway serious C. It may have been the first time, actually. The sketch surely is very easily improved by somebody who knows what they are doing. I intended to improve it myself. But the project is currently abandoned and The code is doing what it should in a way I initially had in mind as the goal. But I'll leave the mess of the comments in for the case that somebody wants to make out what I was thinking.


// Funktionen umschreiben: Beim Empfangen wird erwartet: 1. der AT-Command zurück, 2. eine Antwort, 3. OK oder ein ERROR.
//                         Daher sollte abgefragt werden, bis entweder OK oder ERROR kam oder 20/50/9001(?) Abfragen lang weder OK noch ERROR an kam.
//                         Die Antwort in Variable speichern? Naja, String zurückgeben halt.
//                         Antworten, die mit "^" anfangen brauchen nicht gehandlet zu werden, da keine Kommandos, die mit AT^ beginnen gesendet werden.


#include  

SoftwareSerial A6MODULE(6,7);
int intled = 13; // Internal LED
int successled = 8; // Green LED
int failled = 9; // Red LED
int wrongpinled = 10; // Orange LED

boolean debug=true;

//String commands[5] = { "AT", "AT+CPINC2", "AT+CPIN?", "AT+CLCK=\"SC\",2", "AT+CPIN=\"3010\"" };
//int command = 0;

const byte maxmsglength = 32;
char received[maxmsglength];
boolean newData = false;
String response = "";

int i=0;

/*
To check/do:
1  AT: OK?
2  is PUK required - abort
3  are less than 3 PIN attempts left? - abort AT^CPINC=?
4  is PIN disabled
       5  enable it: 0000
6  is PIN enabled
       7  unlock
8  is card unlocked
       9  change PIN: 1996
              was PIN wrong - report and leave it
*/


void setup() {
  pinMode(intled, OUTPUT);
  pinMode(successled, OUTPUT);
  pinMode(failled, OUTPUT);
  pinMode(wrongpinled, OUTPUT);
  // All LEDs turn on at the beginning and stay on during the wait period at the beginning, then turn off before communication with the A6 module starts.
  digitalWrite(intled, HIGH);
  digitalWrite(successled, HIGH);
  digitalWrite(failled, HIGH);
  digitalWrite(wrongpinled, HIGH);
  Serial.begin(9600);
  delay(500);
  digitalWrite(intled, LOW);
  digitalWrite(successled, LOW);
  digitalWrite(failled, LOW);
  digitalWrite(wrongpinled, LOW);
  A6MODULE.begin(9600);
  delay(500);
  digitalWrite(intled, LOW);
}

void loop() {
  sendtoa6("AT");
  if(getfroma6("OK")) {
//    sendtoa6("AT+CPIN?");
//    if(getfroma6("+CPIN:SIM PUK")) { fail; }         // If the required password is PUK, abort.
//    sendtoa6("AT+CPIN?");
//    if(getfroma6("+CPIN:SIM PIN2")) { fail; }        // If the required password is PIN2, abort.
//    sendtoa6("AT+CPIN?");
//    if(getfroma6("+CPIN:SIM PUK2")) { fail; }        // If the required password is PUK2, abort.

// WAIT FOR SWITCH RELEASE FIRST
    sendtoa6("AT+CPIN?");
    getfroma6("+CPIN:SIM PIN");                      // The last non-empty response will be stored in the global response variable. Problem with this: If the A6 module sends an unsolicitated message before the response to the CPIN command, nothing gets done and the card needs to be re-inserted again.
    if(strcmp(response, "OK") == 0) {                // If already no PIN is required

//      sendtoa6("AT+CLCK=\"SC\",2"); // Ist PIN-Abfrage eingeschaltet? Oder ist es "SC"?
//      if(getfroma6(???)) { PIN-Abfrage einschalten mit 0000; }

      // ENABLE PIN HERE
      d("I don't know how to enable the PIN.");

    }
    if(response = "+CPIN:SIM PIN") {                 // If the required password is PIN, continue.
      sendtoa6("AT^CPINC=?");
      if(getfroma6("^CPINC: 3")) {                   // If not exactly 3 attempts are left, abort. (should be larger than or equal to 3, shouldn't it?)
        sendtoa6("AT+CPIN=\"0000\"");                // Freischalten mit 0000
        delay(50);
        if(!getfroma6("OK")) { fail; }               // If that was not the right password, abort.
        sendtoa6("AT+CPWD=\"SC\",\"0000\",\"1996\"");// PIN ändern
        delay(500);
        if(getfroma6("OK")) { Serial.println("Looking good."); }

//      sendtoa6("AT+CMGD=0,4"); // Should delete all SMS
//      if(getfroma6(???)) { ; }
        d("I don't know how to delete SMS.");

        sendtoa6("AT+CPIN?");
        if(getfroma6("+CPIN:READY")) {
          
          // TURN OFF A& MODULE FOR SAFE CARD REMOVAL

          digitalWrite(successled, HIGH);
        }
      } else {                                         // If not exactly 3 times left
        fail;
      }
      delay(1000);
    }
  }
}

void fail() {
  digitalWrite(failled, HIGH);               // Turn red fail LED on and ...
  d("Something failed! Ending programme.");
  while(1);                                  // ... don't do anything anymore.
}

void wrongpin() {
  digitalWrite(wrongpinled, HIGH);           // Turn yellow LED on and ...
  d("Wrong PIN! Ending programme.");
  while(1);                                  // ... don't do anything anymore.
}

//boolean getfroma6(char str[32], char str1[32], char str1[32], char str1[32], char str1[32], char str1[32]) { // Returns true if the passed (expected) message was received, false if anything else was received.
boolean getfroma6(char str[32]) { // Returns true if the passed (expected) message was received, false if anything else was received.
  boolean asexpected = false;
    for (i = 1; i < 9; ++i) {
    receivelinefroma6();
//    d("d1 "+response);

    if(received[0] == '\0') {                            // If the received message is empty
      continue;
    } else {
      response = received;
    }
    if(strstr(received, "ERROR") != NULL) {              // If the received message contains "ERROR"
      d("Received an error: "+response);
      fail;
    }
    if(received[0] == '+') {                             // If the received message starts with a "+" sign
      d("Reseived response: "+response);
    } else {
      if(strstr(received, "OK") != NULL) {               // If the received message is "OK"
        d("Received OK.");
        asexpected = true;                               // Also treat OK like the expected message. No unexpected OK should ever be sent from the A6 module. So this is fine. No, it is, really.
//        if(asexpected) { return true; }
      } else {
        if(strncmp(received,"AT",2) == 0) {              // If the received message starts with "AT"
          d("Received AT: "+response);
        } else {                                         // For any other received message
          d("Received: "+response);
        }
      }
    }
    newData = false;
    if(strstr(received, str) != NULL) {
      d("Received expected message: "+response);
      asexpected = true;
    }
  }
  if(asexpected) { return true; }
  return false;
}


//void handleresponse() {
//  response = received;
//  if(received[0] == '+') {
//    d("               Response: "+response);
//  } else {
//    if(strstr(received, "OK") != NULL) {
//      d("               It's okay.");
//    } else {
//      if(strncmp(received,"AT",2) == 0) {
//        d("               I've sent: "+response);
//      }
//    }
//  }
//  newData = false;
//}



void receivelinefroma6() {
  delay(80);
  static byte counter = 0;
  char rc;
  
  received[0] = '\0';

  while (A6MODULE.available() > 0 && newData == false) {
    rc = A6MODULE.read();

    if (rc != '\n') {
      received[counter] = rc;
      counter++;
      if (counter >= maxmsglength) {
          counter = maxmsglength - 1;
      }
    }
    else {
      received[counter] = '\0'; // terminate the string
      counter = 0;
      newData = true;
    }
  }
}

void sendtoa6(String command) {
//  Serial.println(command);
  A6MODULE.println(command);
  d("Sent: "+command);
}

void d(String line) {
  if (debug == true) { Serial.println(line); }
}

(tba:connections,assembly,photos?)

Comment via email

SBWG 0.10.7

So many ideas, so little time. So many todos, no little time. So little time, so much rest of my life. But the todo list has actually started to become a little shorter for the first time in a long time. As with the previous entries about my progress with SBWG, I'm not going to address or list everything that I've improved or added. But I feel like it's time for another update.

File attachments pretty much work as intended now. Text files still can't be file attachments to entries, because text files are entries. But I think that will stay as it is for now because I don't need to attach text files to entries and if I would, I could gzip, bzip or 7z them. I mainly wanted file attachments for entry images and podcast support. Both works as well as I need it to. But some things could still be improved in the future.

Referencing tags are improved, their notes look better and there is now a way to mark an entry as an update of an other entry, giving both entries a note that tells the reader about the newer/older version. And since this works now, I dropped the idea to introduce any form of content revisioning. An entry revision system would be over the top for a feature that I hardly use. This could still be implemented just with hooks.

SBWG was relying on a feature of ImageMagick's mogrify that turned out to be a bug and was fixed. So I had to switch to convert with worse tolerance/support for broken image files. That's annoying, but I'm over it now. I mean, I wasn't complaining. Those tools are amazing and I'm so glad that they are free.

There were a number of other bugs that I've fixed. Some of them old and overlooked. But most of them were introduced not long ago. Well, I guess that's what happens if you don't do proper tests every time. SBWG is starting to become a feature-rich tool and every new feature that gets implemented could cause trouble with other features or combinations of features. In early versions of SBWG I didn't always test everything I changed. I now do, and I now also try to think of some related things the change could have effected unintentionally and test those basically. But proper tests of all sorts of scenarios every time I publish a new version? That would be professional but not worth the effort in this case. If I'm not using a feature, it doesn't matter much if I break it. I think I'll probably do more extensive tests every now and then.

Entries can now have comment links. If there is an email address available for an author, all their entries get an email link below them to allow readers to reply to them. For a public blog it might be best to use throwaway addresses that can quickly be replaced if they start to receive spam. I'd have some ideas to improve the email composed by this comment feature. But they would have to become HTML emails. So I forgot about them again.

New tag types, expanded README file, improved navigation by adding parent links and things like this, improved CSS a bit here and there, very small improvements to the code style. I didn't make any relevant improvements or corrections in terms of code quality. I think this is where SBWG could improve most. It's not a professional thing, so I declare myself fine with the way it is (which isn't that bad compared to some other software, I think) but I could learn a lot there.

Command line options can now be grouped to make typing commands easier. Long options (starting with --) didn't change (I may make those things POSIX-like, too, some other time) but short options (starting with a -) now don't need to be separated and all have their own dash. So sbwg -v -p -e blub can now be shortened to sbwg -vpe blub. And if you want to run the command again but with added verbosity, you can add the second -v wherever you want.

There is now a waiting animation that starts to play if there is no update on stdout for three seconds. Both the animation frames and the time delay can be changed. The animation is only enabled if SBWG runs with any verbosity. Then it is enabled by default. It will be disabled by default in future versions though, I think, because it's such an unnecessary messing around with terminal output. It does work pretty well though. I thought it may be harder to make it work as smoothly as it does now (which isn't 100% perfect, but pretty good).

The new default style set 'elth' is a working hybrid with different styles for small phone screens and larger screens of phablets, tablets and laptops. It's composed of several CSS files, which should make it easier to create a custom style now, since just the basics (without any colors and fancy embolishment and without any tag-specific stuff) can be copied for a template, or just the mobile style can be copied and used to create a new mobile style. Style sets can now also include files whose name don't end in '.css'. That means they can contain any file type. So JS or background images or whatever will be copied as part of the style set and placed in the 'styles/' directory of the generated web site.

More things are now cached that may be used more than once in one run of SBWG. Permament caches (option -C/--cache) can now be enabled for only parts of the web site. I still need to decide how permanent caches should be managed. The way I had/have it in mind does not seem very intuitive. It is to me because I know how it's built. But... well, maybe it's enough that I think that it makes sense. Maybe I should just start using it and if it works well, write it down in the README file.

Added new hooks, gave the helper scripts makeovers, made how HTML footers are made logical, sorted much of the remaining todos. Overall: progress.

So, I've published SBWG version 0.10.7 now. I wish I'll find the time to create and publish new versions more frequently again in the near future. But I doubt I will.

Comment via email