?:
Some “freezing-cold-New-Hamshire-Winter” morning metal:
?:
Organization for Flask + React + Typescript + MongoDB using the nifty Blueprints library.
- this project on github is over here
Setup:
Trans: Latin prefix implying "across" or "Beyond", often used in gender nonconforming situations – Scend: Archaic word describing a strong "surge" or "wave", originating with 15th century english sailors – Survival: 15th century english compound word describing an existence only worth transcending.
Some “freezing-cold-New-Hamshire-Winter” morning metal:
Organization for Flask + React + Typescript + MongoDB using the nifty Blueprints library.
Setup:
..also, check out the sporadically maintained Terrific Music list too @ /musics :)***
…Despite the ubiquitousness of needing to make a POST request from a browser (or, perhaps for this very reason) there seems to be just as many ways, methods, libraries, and standards of implementing http functions in JavaScript as there are people doing said implementing. Between the adoption of the fetch api in browsers and the prevalence and power of Promises in JS, asynchronous http needn’t be a hassle!
/*
...happily processing some data in a browser, when suddenly...
....panik!
you need to complete a portion of this processing elsewhere on some server...:
*/
Or, when life gives you apples, use Linux
Seemingly harder to remove with every eye-glazing gist and thread… A mac plagued with an is_mdm_removable=false
Mobile Device Management profile: the worst! 🙂
First, boot into recovery mode by rebooting while holding down the Command
& R
keys.
At this stage, you’ll need to connect to the internet briefly to download the recovery OS. This provides a few tools including like disk utility, support, an osx reinstaller- at the top menu, you’ll find an option to access a terminal.
Once in there, you’ll want to:
Disable SIP:
csrutil disable
Then reboot:
reboot now
While holding down Command
+ Option
+ P
+ R
to start afresh with cleared NVRAM.
Reboot once again while holding down the Command
& R
keys to return to the recovery OS. Reinstall whatever version of OSX it offers- instead of trying to deal with the slippery, network connected DEP plists & binaries contained within the various LaunchAgents
and LaunchDaemons
found in the /System/Library
directories directly, we’ll let Apple finish with the ConfigurationProfiles
first, then sneak in and remove them.
While this stuff is cooking, get yourself a usb stick and a penguin, such as Budgie:
wget -nd http://cdimage.ubuntu.com/ubuntu-budgie/releases/20.04.1/release/ubuntu-budgie-20.04.1-desktop-amd64.iso
umount /dev/sdc 2>/dev/null || true
sudo dd if=ubuntu-budgie-20.04.1-desktop-amd64.iso of=/dev/sdc bs=1048576 && sync
Boot up again, this time holding the Option
key for the bootloader menu. Once in the live usb system, make sure you can read Apples HFS filesystem:
sudo apt-get install hfsprogs
For me at least, I needed to run a quick fsck
to fix up the headers before I could mount the osx filesystem living at /dev/sda2
(sda1
is the efi
partition):
sudo fsck.hfsplus /dev/sda2
Now, lets go in there and remove those ConfigurationProfiles:
mkdir badapple
sudo mount -o force /dev/sda2 badapple
cd badapple
sudo rm -rf private/var/db/ConfigurationProfiles/*
🙂
Hmmmm…..
…In the mean time...
./OpenCore-Boot.sh:
#!/usr/bin/env bash
# setup tap0 if haven't already for $session:
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up promisc on
sudo ip link set dev virbr0 up
sudo ip link set dev tap0 master virbr0
REPO_PATH="./"
OVMF_DIR="."
args=(
-enable-kvm -m 24000 -cpu Penryn,kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check
-machine q35
-smp 4,cores=2,sockets=1
-device usb-ehci,id=ehci
-device usb-kbd,bus=ehci.0
-device usb-mouse,bus=ehci.0
-device nec-usb-xhci,id=xhci
-device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
-drive if=pflash,format=raw,readonly,file="$REPO_PATH/$OVMF_DIR/OVMF_CODE.fd"
-drive if=pflash,format=raw,file="$REPO_PATH/$OVMF_DIR/OVMF_VARS-1024x768.fd"
-smbios type=2
-device ich9-intel-hda -device hda-duplex
-device ich9-ahci,id=sata
-drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file="$REPO_PATH/OpenCore-Catalina/OpenCore-nopicker.qcow2"
-device ide-hd,bus=sata.2,drive=OpenCoreBoot
-device ide-hd,bus=sata.3,drive=InstallMedia
-drive id=InstallMedia,if=none,file="$REPO_PATH/BaseSystem.img",format=raw
-drive id=MacHDD,if=none,file="$REPO_PATH/mac_hdd_ng.img",format=qcow2
-device ide-hd,bus=sata.4,drive=MacHDD
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:27
-vga vmware
)
qemu-system-x86_64 "${args[@]}"
Check out this project on my Github over here 🙂
Chrome remote desktop is fantastic, but often clashes with Xorg nuances from a variety of desktop environments in Ubuntu. This chrome-remote-desktop
script extends and replaces the version automatically installed by Google in /opt/google/chrome-remote-desktop/chrome-remote-desktop
. This stuff is only relevant for accessing your Ubuntu machine from elsewhere (e.g. the "server", the client machine should not be installing anything, all it needs is a web browser).
Set up the server:
Before patching anything or pursuing other forms of delightful tomfoolery, follow the installation instructions provided by Google. Set up everything normally- install Google’s .deb download with dpkg, set up a PIN, etc.
The trouble comes when you are trying to remote in- some problems you may encounter include:
Patch it up:
# get this script:
# wget https://raw.githubusercontent.com/Jesssullivan/chrome-remote-desktop-budgie/master/chrome-remote-desktop
# or:
git clone https://github.com/Jesssullivan/chrome-remote-desktop-budgie/
cd chrome-remote-desktop-budgie
# behold:
python3 chrome-remote-desktop
# ...perhaps, if you are keen (optional):
sudo chmod u+x addsystemd.sh
sudo ./addsystemd.sh
What does this do?
We are primarily just enforcing the use of existing instances of X and correct display values as reported by your system.
/usr/local/bin/
in addition updating the one executed by Chrome in /opt/google/chrome-remote-desktop/
. /usr/local/bin/chrome-remote-desktop.github
, and will let the user know if there are updates. /opt/
too as chrome-remote-desktop.verbatim
. chrome-remote-desktop
will always make sure it is where it should be, even after Google pushes updates and overwrites everything in /opt/
.….Updated 07/19/2020
Bits & bobs, this & that of late:
…In effort to thwart the recent heat and humidity here in the White Mountains (or, perhaps just to follow the philosophy of circuitous overcomplication… 🙂 ) here are some sketches of quick-release exhaust fittings of mine for a large, wheeled AC & dehumidifier unit (these have been installed throughout my home via window panels).
…Sketching out a severely overcomplicated "computer shelf", rapid-fab style:
(plasma cut / 3d printed four-post server rack == RepRapRack?? xD) 🙂
…Also, Ryan @ V1Engineering recently released his new MPCNC Primo here, should anyone be keen. Long Live the MPCNC! 🙂
…Oodles of fun everyday over in the clipi
project- check it out!
xD
Find this project on my github here!
…post updated 07/19/2020
An efficient toolset for Pi devices
Emulate, organize, burn, manage a variety of distributions for Raspberry Pi.
Emulate:
clipi
virtualizes many common sbc operating systems with QEMU, and can play with both 32 bit and 64 bit operating systems.
clipi
will handle the rest.Organize:
clipi
builds and maintains organized directories for each OS as well a persistent & convenient .qcow2 QEMU disk image.
clipi
cleans up after itself under the Utilities...
menu. Write:
clipi
burns emulations to external disks! Just insert a sd card or disk and follow the friendly prompts. All files, /home
, guest directories are written out.
/boot
in the freshly burned disk. /boot
too. clipi
provides options for writing from an emulation’s .qcow2
file via qemu… verbatim
argument Manage:
clipi
can find the addresses of all the Raspberry Pi devices on your local network.
clipi
can install itself as a Bash alias (option under the Utilities...
menu, fire it up whenever you want. Shortcuts:
Shortcuts & configuration arguments can be passed to clipi
as a .toml (or yaml) file.
# <shortcut>.toml
# you can access the same tools and functions visible in the interactive menu like so:
'Burn a bootable disk image' = true
# same as selecting in the interactive cli
'image' = 'octoprint'
'target_disk' = 'sdc'
clipi
exposes many features only accessible via configuration file arguments, such as distribution options and emulation settings.# <shortcut>.toml
# important qemu arguments can be provided via a shortcut file like so:
'kernel' = "bin/ddebian/vmlinuz-4.19.0-9-arm64"
'initrd' = "bin/ddebian/initrd.img-4.19.0-9-arm64"
# qemu arguments like these use familiar qemu lexicon:
'M' = "virt"
'm' = "2048"
# default values are be edited the same way:
'cpu' = "cortex-a53"
'qcow_size' = "+8G"
'append' = '"rw root=/dev/vda2 console=ttyAMA0 rootwait fsck.repair=yes memtest=1"'
# extra arguments can be passed too:
'**args' = """
-device virtio-blk-device,drive=hd-root \
-no-reboot -monitor stdio
"""
# additional network arguments can be passed like so:
# (clipi may automatically modify network arguments depending on bridge / SLiRP settings)
'network' = """
-netdev bridge,br=br0,id=net0 \
-device virtio-net-pci,netdev=net0
"""
Supply a shortcut file like so:
python3 clipi.py etc/find_pi.toml
take a look in /etc for some shortcut examples and default values
bridge networking things:
kernel stuff:
automate ramdisk & kernel extraction-
most functions to do so are all ready to go in /kernel.py
other random kernel todos-
gcp-io stuff:
formalize ddns.py & dockerfile
make sure all ports (22, 80, 8765, etc) can up/down as reverse proxy
# clone:
git clone https://github.com/Jesssullivan/clipi
cd clipi
# preheat:
pip3 install -r requirements.txt
# (or pip install -r requirements.txt)
# begin cooking some Pi:
python3 clipi.py
Open Source Summit + Embedded Linux Conference!
Jess’s Monday:
In other tangents…
….Dover Microsystem’s Genesys 2 FPGA is moving into it’s new home, v6:
….A quick polyphase hub motor sketch around a Toyota wheel bearing:
fdisk -l
has got to be one of the more common disk-related commands one might use while fussing about with raw disk images. The fdisk utility is ubiquitous across linux distributions (also brew install gptfdisk
and brew cask install gdisk
, supposedly). The -l
argument provides a quick look raw sector & file system info. Figuring out the Start, End, Sectors, Size, Id, Format
of a disk image’s contents without needing to mount it and start lurking around is handy, just the sort of thing one might want to do with Python. Lets write a function to get these attributes into a dictionary- here’s mine:
import subprocess
import re
def fdisk(image):
# `image`, a .img disk image:
cmd = str('fdisk -l ' + image)
# read fdisk output- everything `cmd` would otherwise print to your console on stdout
# is instead piped into `proc`.
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
# the raw stuff from stdout is not parseable as is, so we read into a string:
result = proc.stdout.read().__str__()
# figure out what type we should iterate with when looking via file / part contained within image. I have no idea if anything besides .img will work- YMMV, but YOLO xD
if '.iso' in result:
iter = '.iso'
if '.qcow2' in result:
iter = '.qcow2'
else:
iter = '.img'
# chop up fdisk results by file / partition-
# the resulting `parts` are equivalent to fdisk "rows" in the shell
parts = re.findall(r'' + iter + r'\d', result)
# dictionary `disk` contains each "row" from `parts`:
disk = {}
for p in parts:
# sub dictionary 'part' contains the handy fdisk output values:
part = {}
# get just the number words with regex sauce:
line = result.split(p)[1]
words = re.split(r'\s+', line)
# place each word into 'part':
part['Start'] = words[1]
part['End'] = words[2]
part['Sectors'] = words[3]
part['Size'] = words[4]
part['Id'] = words[5]
part['Format'] = words[6].split('\\n')[0]
# stick this part into 'disk', move onto next disk part:
disk[p] = part
return disk
A stylish demo enclosure for the Xilinx / Digilent Genesys 2 with a display panel.
Check out what Dover Microsystems is up to here:
https://www.dovermicrosystems.com/
Prototyping & production @ the D&M Makerspace- see what else we’re up to:
https://makerspace.plymouthcreate.net/
FPGA- Digilent Xilinx Genesys 2 FPGA Reference
The display and HDMI driver board from pimoroni-
The sketch for panel dimensions are shared over here too
You can find the V6 interactive Fusion 360 model over here
…additional V6 svg, stl layouts on tinkercad
Materials:
Size | Type |
---|---|
12"x12" | 1/4" (6.35mm) clear acrylic sheet |
12"x12" | 3mm clear acrylic sheet |
12"x12" | 3mm colored acrylic sheet |
~45 grams | printer plastic (filament or resin) |
Hardware:
Qty | Size |
---|---|
3 | m3x8 |
3 | m3x18 |
1 | m3x20 |
7 | m3 nut |
2 | m2x14 |
2 | m2x10 |
4 | m2 nut |
*”We use the FPGA to prototype / emulate a “Soft Core” CPU with and without Dover’s IP (logic) called CoreGuard.
An FPGA can simulate (sometimes called “emulate”) logical circuits, and is reprogrammable. So you can design circuitry that eventually will be fabricated in silicon, but you can work out bugs and try different designs using the FPGA “fabric”.*
*For demos, we synthesize to the Xilinx FPGA: a design for a RISC-V CPU, a simple UART (serial interface), an interface to the on-board DDR memory and flash memory, and a simple video output. We put some software in the on-board flash, then boot a working RISC-V system. We’ll show how the software can be attacked, using I/O over the serial port to mimic what would typically take place over a network connection. Next, we show the same SoC (CPU + UART + memory) with CoreGuard logic added in. We run the same software and then show that the same attack is blocked by CoreGuard. We also use the FPGA to emulate the Arm CPU that we are interfacing with for our NXP customer.”*
get this script and other GIS bits here on github
The Ebird dataset is awesome. While directly handling data as a massive delimited file- as distributed by the eBird people- is cumbersome at best, the ebird api offers a fairly straightforward and efficient alternative for a few choice bits and batches of data.
The eBird AWK
tool for filtering the actual delimited data can be found over here:
install.packages("auk")
It is worth noting R + auk
(or frankly any R centered filtering method) will quickly become limited by the single-threaded approach of R, and how you’re managing memory as you iterate. Working and querying the data from a proper database quickly becomes necessary.
Most conveniently, the eBird API already exists- snag an key over here.
…The API package for R is over here:
install.packages("rebird")
…There is also a neat Python wrapper over here:
pip3 install ebird-api
Region Codes:
I’m not sure why, but some methods use normal latitude / longitude in decimal degrees while some others use "regionCode"
, which seems to be some kind of eBird special. Only ever seen this format in ebird data.
For example, recent observations uses regionCode
:
# GET Recent observations in a region:
# https://api.ebird.org/v2/data/obs/{{regionCode}}/recent
…But nearby recent observations uses latitude / longitude:
# GET Recent nearby observations:
# https://api.ebird.org/v2/data/obs/geo/recent?lat={{lat}}&lng={{lng}}
Regardless, lets just write a function to convert decimal degrees to this regionCode
thing. Here’s mine:
#!/usr/bin/env python3
"""
# provide latitude & longitude, return eBird "regionCode"
Written by Jess Sullivan
@ https://www.transscendsurvival.org/
available at:
https://raw.githubusercontent.com/Jesssullivan/GIS_Shortcuts/master/regioncodes.py
"""
import requests
import json
def get_regioncode(lat, lon):
# this municipal api is a publicly available, no keys needed afaict
census_url = str('https://geo.fcc.gov/api/census/area?lat=' +
str(lat) +
'&lon=' +
str(lon) +
'&format=json')
# send out a GET request:
payload = {}
get = requests.request("GET", census_url, data=payload)
# parse the response, all api values are contained in list 'results':
response = json.loads(get.content)['results'][0]
# use the last three digits from the in-state fips code as the "subnational 2" identifier:
fips = response['county_fips']
# assemble and return the "subnational type 2" code:
regioncode = 'US-' + response['state_code'] + '-' + fips[2] + fips[3] + fips[4]
print('formed region code: ' + regioncode)
return regioncode
Add EV only mode button for 2009 Prius-
Pinouts and wiring reference here:
http://www.calcars.org/prius-evbutton-install.pdf
Big shiny EV mode button in the Prius!
Fusion 360 files here: https://a360.co/2zOACJJ
Files uploaded to thingiverse here: https://www.thingiverse.com/thing:4422091
xposted to prius chat too:
https://priuschat.com/threads/3d-printed-ev-mode-button-xd.216774/
PLA & Carbon Polycarbonate button housings:
While we’re at it….
See more notes on D&M 3d Printer stuff on github here:
https://github.com/Jesssullivan/Funmat-HT-Notes
…and here:
https://github.com/Jesssullivan/AeroTaz5_hotfix
…Playing with Bandlab’s Sonar reboot –> morning metal ….Frankly the whole suite (yes, Melodyne, the whole nine yards) is way better than when it was with the late Cakewalk, and its all free now. PSA!
…Unexpected success with
Nylon 680 FDA {3mm @ .8} for some rather delicate parts:
…Yet another improved pi monitoring sketch, currently in production w/ polycarbonate & 1/4"… …or to quote Mad-eye Moody, "CONSTANT VIGILANCE!" 🙂
xD
© 2024 Trans Scend Survival
α wιρ Σ ♥ by Jess Sullivan — Up ↑