Ignore this post if you have no idea what ZFS is.
ZFS related notes for posterity. I’ve got it up and running as well as BTRFS. ZFS seems better. So that’s settled.
Ignore this post if you have no idea what ZFS is.
ZFS related notes for posterity. I’ve got it up and running as well as BTRFS. ZFS seems better. So that’s settled.
Soviet sniper in 1942 trying convince a sexist US to assist in fighting Germany:
“Gentlemen,” she said, “I am 25 years old and I have killed 309 fascist invaders by now. Don’t you think, gentlemen, that you have been hiding behind my back for too long?”
Bill Domonkos has some pretty awesome gifs here.
Things can change rapidly. A photo of the model platform from the 1984 Sarajevo Olympics. Later in 1996 it was used as a platform for execution during the Siege of Sarajevo.
This is my first post. That’s a picture of Portugal!
The Arduino is really quite handy to have around. Right now we’ve got one reporting the temperature and humidity of a chicken incubater. It could also control the temperature, humidity, and egg rotation but we haven’t gone there yet. Even so it’s nice to get the measurements with the audible warning. Then you can always repurpose all this stuff to do something else once you are done incubating.
You just need (unvalidated list):
Add in a stepper motor, voltage switch, and some sort of fluid controller and you could do it all. Unglorious image of this – the OLED is very nice:
Here’s the relevant code – it of course plays the 1st 4 notes of Beethoven’s 5th as a warning (or at least an attempt at that not having found the true notes):
#include <Wire.h> #include "Adafruit_GFX.h" #include "Adafruit_SSD1306.h" #include <Adafruit_Sensor.h> #include "DHT.h" #define OLED_DC 11 #define OLED_CS 12 #define OLED_CLK 10 #define OLED_MOSI 9 #define OLED_RESET 13 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); #define DHTTYPE DHT22 // DHT 22 (AM2302) #define DHTPIN 2 // what pin we're connected to DHT dht(DHTPIN, DHTTYPE); #define speakerPin 4 // TONES ========================================== // Start by defining the relationship between // note, period, & frequency. #define c 3830 // 261 Hz #define d 3400 // 294 Hz #define e 3038 // 329 Hz #define f 2864 // 349 Hz #define g 2550 // 392 Hz #define a 2272 // 440 Hz #define b 2028 // 493 Hz #define C 1912 // 523 Hz //TH //thermometer - humidity float temp; float humidity; void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); display.setTextSize(1); display.setTextColor(WHITE); Serial.println("Startup!"); } void loop() { display.clearDisplay(); // clears the screen and buffer getWeather(); } void getWeather() { //----------- //read DHT float humidity = dht.readHumidity(); float t = dht.readTemperature(); t = t * 9.0 / 5.0 + 32.0; // check if returns are valid, if they are NaN (not a number) then something went wrong! if (isnan(t) || isnan(humidity)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(humidity); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } updateDisplay(humidity,t); delay(10000); //10 seconds seems often enough } void updateDisplay(float h, float t) { display.setCursor(0,0); display.print("Temp: "); display.print(t); display.println(" F"); display.println(" "); display.print("Humidity: "); display.println(h); display.println(" "); // warnings if (t < 98.8 || t > 100) { display.println("CHECK TEMP!!!"); display.println(" "); playWarning(); } if (h < 50 || h > 70) { display.println("CHECK HUMIDITY!!!"); playWarning(); } display.display(); } void playWarning() { tone(speakerPin, g); delay(200); noTone(4); delay(200); tone(speakerPin, g); delay(200); noTone(4); delay(200); tone(speakerPin, g); delay(200); noTone(4); delay(200); tone(speakerPin, C); delay(400); noTone(4); }
Here’s a quick python script to use the camera you can attach to a Raspberry Pi and take a picture whenever it detects motion. This is pretty cool, there are all sorts of silly things you can do if you can do motion detection. And to do it with the Raspberry Pi and attached camera is relatively inexpensive (less than $100) to boot! Next time someone knocks our mailbox down we’ll have ’em!
I started from the script here and modified it to just take one picture to both test whether anything changed as well as save the picture if something changed. Seems a bit better than the original taking two pictures – at least this doesn’t cause the Pi to freeze. That means the Pi have to scan a bit larger image for a change but skipping pixels seems to keep it under control. It also takes better pictures as takes some time (the -t 500 in the raspistill call) to calibrate the camera.
#!/usr/bin/env python import StringIO import subprocess import os import time from datetime import datetime from PIL import Image # Motion detection settings: # Threshold (how much a pixel has to change by to be marked as "changed") # Sensitivity (how many changed pixels before capturing an image) # ForceCapture (whether to force an image to be captured every forceCaptureTime seconds) threshold = 10 sensitivity = 2000 forceCapture = True forceCaptureTime = 60 * 60 # Once an hour # File settings saveWidth = 1280 saveHeight = 960 diskSpaceToReserve = 500 * 1024 * 1024 # Keep 500 mb free on disk # Capture a small test image (for motion detection) def captureTestImage(): command = "raspistill -w %s -h %s -t 500 -e bmp -o -" % (1280, 960) imageData = StringIO.StringIO() imageData.write(subprocess.check_output(command, shell=True)) imageData.seek(0) im = Image.open(imageData) buffer = im.load() imageData.close() return im, buffer # Keep free space above given level def keepDiskSpaceFree(bytesToReserve): if (getFreeSpace() < bytesToReserve): for filename in sorted(os.listdir(".")): if filename.startswith("capture") and filename.endswith(".jpg"): os.remove(filename) print "Deleted %s to avoid filling disk" % filename if (getFreeSpace() > bytesToReserve): return # Get available disk space def getFreeSpace(): st = os.statvfs(".") du = st.f_bavail * st.f_frsize return du # Get first image image1, buffer1 = captureTestImage() # Reset last capture time lastCapture = time.time() while (True): # Get comparison image image2, buffer2 = captureTestImage() # Count changed pixels changedPixels = 0 for x in xrange(0, 1280, 4): for y in xrange(0, 960, 4): # Just check green channel as it's the highest quality channel pixdiff = abs(buffer1[x,y][1] - buffer2[x,y][1]) if pixdiff > threshold: changedPixels += 1 # Check force capture if forceCapture: if time.time() - lastCapture > forceCaptureTime: changedPixels = sensitivity + 1 # Save an image if pixels changed if changedPixels > sensitivity: lastCapture = time.time() timeN = datetime.now() print "Save jpg" filename = "capture-%04d%02d%02d-%02d%02d%02d.jpg" % (timeN.year, timeN.month, timeN.day, timeN.hour, timeN.minute, timeN.second) image2.save(filename, "JPEG") keepDiskSpaceFree(bytesToReserve) # Swap comparison buffers image1 = image2 buffer1 = buffer2 time.sleep(2) print "Done waiting"
I had been thinking about the Fermi paradox the other day for no real reason but then XKCD had this comic:
That captures my opinion on it. The Fermi paradox is a bit too anthropocentic, assuming that other life would be like ours and not just happily swimming in oceans, not exploring the universe. Or being bigger than us or smaller or just other.
But then XKCD had this comic today which argues for the Fermi paradox. It is a bit concerning the temperature change estimates when viewed this way.
I suppose I did read this wrong the first time, it’s not as scary as I originally thought! My poor reading comprehension had us off the scale but we’re only at the question mark for now. I suppose in 100 years we’ll have it figured out, we’re good at figuring things out. So I’ll still scoff at the Fermi paradox.
So looking at XKCD you’d think ‘How could they possibly let this bug go?’ That’s so obvious:
Looking at this other blog that purports to show the code causing the issue (and I do look at various forms of computer code daily) you’d say ‘How the heck would they ever know this is a problem?’ Perhaps we shouldn’t be allowed to code in C. The fix:
The fix
The most important part of the fix was this:
/* Read type and payload length first */ if (1 + 2 + 16 > s->s3->rrec.length) return 0; /* silently discard */ hbtype = *p++; n2s(p, payload); if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; /* silently discard per RFC 6520 sec. 4 */ pl = p;This does two things: the first check stops zero-length heartbeats. The second check checks to make sure that the actual record length is sufficiently long. That’s it.
OK, maybe I see somewhere there a related fix they descibe. I suppose if one gets over the ‘s->s3->rrec.length’ it makes sense as long as they are doing that (I assume) pointer *p++ right too. And pl=p, that’s totally obvious!
If you look here it wasn’t looking to request lengths at all before the fix. Some QA! If the technology is to allow you to request a number of letters and you don’t test that you can get more than you should that is still sort of bad.
Thank goodness for SQL, Java, and Python! Even thank goodness for Mumps (the programming language). At least (not in Mumps) then you could make the request an object of the requested length and drop everything else.
This site was secure I found thanks to it using forward secrecy (at least since the conversion to Debian – seems like the old version of FreeBSD was unaffected as well). No idea how it was using that but phew! Since ran some SSL check and we’re an even more tight ship now!