More science
Xuebing Du
Peter Solarz
let's talk about Bridgerton tea, my ask is open

@theartofmadeline
KIROKAZE
🪼

blake kathryn
almost home
styofa doing anything

pixel skylines

Kiana Khansmith
Claire Keane

Love Begins
hello vonnie
Misplaced Lens Cap
we're not kids anymore.

shark vs the universe

No title available
Monterey Bay Aquarium
trying on a metaphor
seen from Malaysia

seen from Malaysia

seen from Malaysia
seen from United States
seen from South Korea
seen from United States

seen from United States
seen from Türkiye

seen from United States
seen from United States

seen from Greece

seen from Malaysia

seen from Malaysia

seen from United States

seen from Singapore
seen from United States

seen from Malaysia

seen from United States

seen from Germany
seen from France
@spevo112
More science
Science testing the new gravel suspension
Finishing up work on the Evo for the Headwaters rally this weekend and suspension is done sans getting aligned.
The first one goes on the second one which goes on the back of the rally car.
8″ travel Bilstein 50mm inverted struts almost ready for the rally car!
Scrubbing non-UTF8 Characters Postgres
This PGSQL function loops through the bytes of a text data type and drops any bytes that don’t conform to UTF8 standard:
CREATE OR REPLACE FUNCTION utf8clean(text) RETURNS TEXT AS $$ DECLARE string ALIAS FOR $1; i INT := 0; bytecount INT; bytes INT[]; byte INT; tmp BYTEA := decode('5c', 'hex'); -- We just need some valid byte to use for set_byte src passed BYTEA; out TEXT; BEGIN IF $1 is NULL OR octet_length($1) = 0 THEN return $1; END IF;
bytes := ARRAY( SELECT get_byte(convert_to(string, 'UTF8'), x) FROM generate_series(0, octet_length(string) - 1, 1) x );
IF array_length(bytes, 1) IS NULL THEN RETURN $1; END IF;
bytecount := array_length(bytes, 1);
-- Look forward implementation to avoid having to store seen values FOR i IN 0..bytecount LOOP byte := bytes[i];
IF byte = 10 OR byte = 13 OR byte BETWEEN 32 AND 127 THEN -- 1-byte UTF8 IF passed is NULL THEN passed := set_byte(tmp, 0, byte); ELSE passed := passed || set_byte(tmp, 0, byte); END IF; END IF;
IF byte BETWEEN 194 AND 223 THEN -- 2-byte UTF8 IF bytes[i+1] BETWEEN 128 AND 191 THEN IF passed is NULL THEN passed := set_byte(tmp, 0, byte); ELSE passed := passed || set_byte(tmp, 0, byte); END IF;
passed := passed || set_byte(tmp, 0, bytes[i+1]); END IF; i := i + 1; END IF;
IF byte = 224 THEN -- 3-byte UTF8 IF bytes[i+1] BETWEEN 160 AND 191 AND bytes[i+2] BETWEEN 128 AND 191 THEN IF passed is NULL THEN passed := set_byte(tmp, 0, byte); ELSE passed := passed || set_byte(tmp, 0, byte); END IF;
passed := passed || set_byte(tmp, 0, bytes[i+1]); passed := passed || set_byte(tmp, 0, bytes[i+2]); END IF; i := i + 2; END IF;
IF byte BETWEEN 225 AND 236 THEN -- 3-byte UTF8 IF bytes[i+1] BETWEEN 128 AND 191 AND bytes[i+2] BETWEEN 128 AND 191 THEN IF passed is NULL THEN passed := set_byte(tmp, 0, byte); ELSE passed := passed || set_byte(tmp, 0, byte); END IF;
passed := passed || set_byte(tmp, 0, bytes[i+1]); passed := passed || set_byte(tmp, 0, bytes[i+2]); END IF; i := i + 2; END IF;
IF byte = 237 THEN -- 3-byte UTF8 IF bytes[i+1] BETWEEN 128 AND 159 AND bytes[i+2] BETWEEN 128 AND 191 THEN IF passed is NULL THEN passed := set_byte(tmp, 0, byte); ELSE passed := passed || set_byte(tmp, 0, byte); END IF;
passed := passed || set_byte(tmp, 0, bytes[i+1]); passed := passed || set_byte(tmp, 0, bytes[i+2]); END IF; i := i + 2; END IF;
IF byte BETWEEN 238 AND 239 THEN -- 3-byte UTF8 IF bytes[i+1] BETWEEN 128 AND 191 AND bytes[i+2] BETWEEN 128 AND 191 THEN IF passed is NULL THEN passed := set_byte(tmp, 0, byte); ELSE passed := passed || set_byte(tmp, 0, byte); END IF;
passed := passed || set_byte(tmp, 0, bytes[i+1]); passed := passed || set_byte(tmp, 0, bytes[i+2]); END IF; i := i + 2; END IF;
IF byte = 240 THEN -- 4-byte UTF8 IF bytes[i+1] BETWEEN 144 AND 191 AND bytes[i+2] BETWEEN 128 AND 191 AND bytes[i+3] BETWEEN 129 AND 191 THEN IF passed is NULL THEN passed := set_byte(tmp, 0, byte); ELSE passed := passed || set_byte(tmp, 0, byte); END IF;
passed := passed || set_byte(tmp, 0, bytes[i+1]); passed := passed || set_byte(tmp, 0, bytes[i+2]); passed := passed || set_byte(tmp, 0, bytes[i+3]); END IF; i := i + 3; END IF;
IF byte BETWEEN 241 AND 243 THEN -- 4-byte UTF8 IF bytes[i+1] BETWEEN 128 AND 191 AND bytes[i+2] BETWEEN 128 AND 191 AND bytes[i+3] BETWEEN 129 AND 191 THEN IF passed is NULL THEN passed := set_byte(tmp, 0, byte); ELSE passed := passed || set_byte(tmp, 0, byte); END IF;
passed := passed || set_byte(tmp, 0, bytes[i+1]); passed := passed || set_byte(tmp, 0, bytes[i+2]); passed := passed || set_byte(tmp, 0, bytes[i+3]); END IF; i := i + 3; END IF;
IF byte = 244 THEN -- 4-byte UTF8 IF bytes[i+1] BETWEEN 128 AND 143 AND bytes[i+2] BETWEEN 128 AND 191 AND bytes[i+3] BETWEEN 129 AND 191 THEN IF passed is NULL THEN passed := set_byte(tmp, 0, byte); ELSE passed := passed || set_byte(tmp, 0, byte); END IF;
passed := passed || set_byte(tmp, 0, bytes[i+1]); passed := passed || set_byte(tmp, 0, bytes[i+2]); passed := passed || set_byte(tmp, 0, bytes[i+3]); END IF; i := i + 3; END IF; END LOOP;
out := convert_from(passed, 'UTF8');
RETURN out; END; $$ LANGUAGE plpgsql IMMUTABLE;
Test RSS
Just a test.
SwiftyJSON and HTTP POST
Here's an incredibly simple example of how to HTTP POST using SwiftyJSON in Xcode:
var jsonerror:NSError? var postData = ["firstname": "bob", "lastname": "fossil"] var jsonData = JSON(postData) var post:NSData = jsonData.rawData()!; var postLength:NSString = String(post.length) var url:NSURL = NSURL(string: "https://some.server.com/mobile.php")! var request:NSMutableURLRequest = NSMutableURLRequest(URL: url) request.HTTPMethod = "POST" request.HTTPBody = post request.setValue(postLength, forHTTPHeaderField: "Content-Length") request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") if let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil) { println(data) }
postData is just a swift dictionary collection. The next line converts it to a JSON structure then the line after that does the magic, it returns NSData which is the type required by request.HTTPBody.
Beefy Bilstein boing-sticks for the Evo arrived today. Human person for scale.
Ojibwe Forest Rally 2014
It's great seeing Mitsubishi back to their rally/raid roots with some new tech.
For podCast subscribers.
For podCast subscribers