tag:blogger.com,1999:blog-32797728277147436982024-03-13T07:58:29.015-07:00Whirly's WorldWhirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.comBlogger76125tag:blogger.com,1999:blog-3279772827714743698.post-58046879962759920292024-02-15T18:25:00.000-08:002024-02-15T18:25:56.069-08:00n8n MongoDB Node - "insert"<p>This might be the first of several "missing manual" posts for n8n. The product itself is amazing, but the documentation, and sometimes even the related forum posts are miserably lacking. This one is about the MongoDB "insert" function. It should be straightforward and easy, but it does NOT work like you would expect. If you mouse-hover over the question-mark icons on each input field in the editor form, it helps a little, but still might get you past "trial and error" mode.</p><h2 style="text-align: left;">What the Docs COULD Say</h2><p>The value of the "Fields" input must be a comma-separated list of attribute names from the root level of one item in the input data for the node. For example, if the input data contained this:</p><p><span style="font-family: courier;">[<br /></span><span style="font-family: courier;"> {<br /></span><span style="font-family: courier;"> "name": "Bob"<br /></span><span style="font-family: courier;"> "address": {<br /></span><span style="font-family: courier;"> "street": </span><span style="font-family: courier;">"123 Main St",</span><br style="font-family: courier;" /><span style="font-family: courier;"> "city": "Lincoln",</span><br style="font-family: courier;" /><span style="font-family: courier;"> "state": "NE",</span><br style="font-family: courier;" /><span style="font-family: courier;"> "zip": "68516"<br /> },<br /></span><span style="font-family: courier;"> "age": 42<br /></span><span style="font-family: courier;"> },<br /></span><span style="font-family: courier;"> {<br /></span><span style="font-family: courier;"> "name": "Susan"<br /></span><span style="font-family: courier;"> "address": {<br /></span><span style="font-family: courier;"> "street": </span><span style="font-family: courier;">"456 Smith Ave",<br /></span><span style="font-family: courier;"> "city": "Springfield",<br /></span><span style="font-family: courier;"> "state": "IL",<br /></span><span style="font-family: courier;"> "zip": "62704"<br /></span><span style="font-family: courier;"> },<br /></span><span style="font-family: courier;"> "age": 38<br /></span><span style="font-family: courier;"> }<br /></span><span style="font-family: courier;">]</span></p><div style="text-align: left;">...then the MongoDB node insert "<b>Fields</b>" could be...</div><div style="text-align: left;"><br /></div><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"><div style="text-align: left;"><b>name, age</b></div></blockquote><p> ...and 2 JSON objects (without <b>"address": "value"</b> attributes) would be inserted into the specified collection in MongoDB.</p><p>Option: "Use dot notation" (Select/add, then enable)</p><p></p><ul style="text-align: left;"><li>Allows nested attributes to be selected as an included field (excluding peer attributes in the sub-object).</li><li>This does NOT flatten the structure, but filters which nested fields get included</li><li>For example, field list could be:<br /></li></ul><p></p><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"><p style="text-align: left;"><b>name, age, address.zip</b></p></blockquote><p>Option: "Date Fields"</p><p></p><ul style="text-align: left;"><li>This is a second comma-separated list field names, but these get converted to MongoDB BSON date values in the inserted object... if you need that for some reason.</li></ul><p></p><p> Other notes:</p><p></p><ul style="text-align: left;"><li>Whitespace between fields in the comma separated list of field names will be ignored.</li><li>If dot notation is specified as a field name <b>without</b> the "Use dot notation" option enabled, the output will most likely include a null attribute like: <b>"somenestedthing.someattribute": null</b></li></ul><p></p><h2 style="text-align: left;">The Actual "Docs" (Barely)</h2><p>https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.mongodb/</p><p>As of 2/2024, this doesn't tell you much of anything. If it were the owner's manual for a car, it wouldn't give you much past: Up to 4 people can fit in it. It goes. Hopefully it also stops.</p><h2 style="text-align: left;">Forums</h2><p></p><ul style="text-align: left;"><li>Subject: "Insert JSON data to MongoDB inserting empty values"</li><ul><li>https://community.n8n.io/t/insert-json-data-to-mongodb-inserting-empty-values/24594</li><li>This post asks why a single JSON document can't just be inserted into MongoDB as is.</li><li>The answer runs off in the weeds with some nonsense about splitting things into fields.</li></ul><li>Subject: "MongoDB Insert key/value formatting"</li><ul><li>https://community.n8n.io/t/mongodb-insert-key-value-formatting/4948</li><li>This post is again from someone confused that the input for a MongoDB insert isn't some sort of reference to both Keys and Values (like a whole JSON document... e.g. $json)</li><li>The answer is a link to some set of examples that seems completely unrelated.</li></ul><li>Subject: "MongoDB insert data?"</li><ul><li>https://community.n8n.io/t/mongodb-insert-data/192</li><li>This might have been asked before the MongoDB built in node/integration was added.</li><li>The answer mentions the "new" integration node, but still doesn't explain how to use it.</li></ul><li>Subject: "How to use the “function node” with a “set node” and a “mongodb insert” in combination?"</li><ul><li>https://community.n8n.io/t/how-to-use-the-function-node-with-a-set-node-and-a-mongodb-insert-in-combination/21059</li><li>This <b>SHOULD </b>be included in a search for "fields.split is not a function", but that important bit of text is buried in a screen shot.</li><li>The answer to the problem most people seem to be having is here if you look carefully, but its one of those things you probably see only after you've figured it out anyway.</li></ul><li>Subject: "How to insert properly data in mongoDB?"</li><ul><li>https://community.n8n.io/t/how-to-insert-properly-data-in-mongodb/4052</li><li>Yet another cry for help, because there is no explanation of how this node works.</li><li>The replies don't help, and the topic is locked (which is why I'm writing here instead of answering there, btw.)</li></ul></ul><p></p><p><br /></p><p><br /></p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-29902971025594443892024-01-27T21:52:00.000-08:002024-01-28T06:09:51.047-08:00IP Masquerading with nftables<h1 style="text-align: left;">Why this is here</h1><p>I realize I'm sorta late to the game writing this, but then I JUST finished sifting through all the half-a$$'d documentation and examples I could find on the topic and NOT ONE of them offered a clear explanation of what is going on with nftables, and what the parts of a masquerading setup mean. So here I am, hoping I can do a better job, because I'm gonna forget how this works, and probably come back here later and want me to explain it to future-me.</p><p>My other motivation for putting this here is to get feedback in comments in case I don't have some part of this quite right. If you see something here that is just wrong, please let me know.</p><h1 style="text-align: left;">The Task</h1><p>Set up a Linux machine, to forward traffic coming in one network interface, to any of the hosts in the network to which another network interface is attached, on any port.</p><p>My reason for doing this was that I had a new Wifi router, that I wanted to set up from my workstation, but my workstation was still connected to the "old" router. I knew one option would be to create ssh tunnels to forward specific ports to the new router's LAN ip, but that meant opening a terminal and connecting / logging-in with the ssh command <b>every</b> time I wanted to open the router's web interface. It also meant I'd have to set up one or more port-forwards to reach/test/reconfigure each device as I moved them. That got tedious fast.</p><h1 style="text-align: left;">The Plan</h1><p>I had a Raspberry Pi ZeroW that I had used for some forgotten thing a while back, and it was just sitting there in a box, gathering dust, begging to be made into a mini-nat-bridge/router between my current (old) network and the new one. So, I searched for stuff like "nat" and "masquerade" and "iptables" because I remember it not being too difficult to get that exact thing working in an older version of Linux. I even had it working once on a coax network with an old 386 machine running RedHat 2 (or something like that), using ipchains. (That was so my wife and I could share our dialup connection to Mindspring instead of taking turns... boy those weren't the days). But, after I installed the latest (Bookworm) Raspberry Pi OS, booted up the pi, connected it to the (old) network, and entered the iptables command, when I saw the dreaded: "command not found", I knew this was a new rabbit hole I had just jumped down.</p><h1 style="text-align: left;">The New Thing</h1><p>Shifting my search strategy to things like "what replaced iptables" and "how do you set up masquerading now," I found that NetFilter has moved (or is nearly moved) from iptables to nftables. I knew from experience that any time there's a subtle name change on something in Linux, right behind that I'll find a drastically different way of doing everything. nftables didn't disappoint. Instead of pre-established chains to which you inject your own rules, you now need to create a hierarchical table that contains its own set of chains, and each of those contains its own set of rules. In a nutshell: </p><p></p><ul style="text-align: left;"><li>Tables belong to a family that designates what subset of traffic it affects (ipv4, arp, ipv6, etc): https://wiki.nftables.org/wiki-nftables/index.php/Nftables_families</li><li>Chains are in a table, and belong to a type (filter, route, or nat), and are associated with a set of hooks that map to the part of the packet handling lifecycle related to the type - e.g. nat has hooks like prerouting and forward.</li><li>Rules are in a Chain, and describe something to be done with a packet.</li></ul><p></p><p>This wiki page expands upon that "bootstrap view" a little: https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes</p><h1 style="text-align: left;">How Does NAT Masquerading Work?</h1><p>Before getting into how to set up nftables for NAT with masquerading, it is helpful to remember what is happening, so:</p><p></p><ul style="text-align: left;"><li>First, some other machine sends packets to the "inbound" network interface that are not destined for the machine that "owns" that interface. This is typically done with a static route on the machine originating those packets, which is treating that interface as if it is part of a router.</li><li>If the machine receiving those "not for me" packets has packet-forwarding enabled, it will just send packets along, through whatever "outbound" network interface it would normally choose if it was originating those packets itself. However, since it doesn't do anything to the fix the return IP address or source port number in those packets, the host that receives them next probably has no idea where to send its response packets, and the round-trip breaks.</li><li>Masquerading dynamically changes the source IP (to the "outbound" interface's IP) and port (to something it generates and keeps track of) so it can receive and re-route response packets back to the originating source IP and port.</li><ul><li>Note SNAT is a variation on this same concept, but does not figure out what the "outbound" IP should be. A SNAT setup depends on a specified, fixed "outbound" IP, which allows it to perform a bit better.</li></ul></ul><p></p><h1 style="text-align: left;">How the nftables Pieces Fit</h1><p>To eliminate ambiguity between stand-in variables and actual values, this example assumes the following:</p><p></p><ul style="text-align: left;"><li>The machine has two network interfaces (because it needs at least two physically separate connections)</li><ul><li>"inbound" connection is</li><ul><li>on network 192.168.5.0/24</li><li>on an interface named "wlan0"</li></ul><li>"outbound" connection is</li><ul><li>on network 192.168.200.0.0/24</li><li>on an interface named "eth0"</li></ul></ul><li>The table needs a name, so we'll name it "nat_all_to_network2"</li><li>Chains can have names, but they'll be named unimaginatively with a shortened form of the hook they reference (e.g. hook prerouting chain will be "pre_rt"</li></ul><div>The <b>nft</b> command is used to create tables, chains, and rules.</div><div><ul style="text-align: left;"><li>Note: Using the <b>nft</b> command in some circumstances relies on terminating argument/parameter (e.g. -a, -x, etc.) parsing before passing a negative number (e.g. -50). You will see where that is needed below.</li><ul><li>In bash at least any dash in the command line, after a double dash ("--") will be parsed as a literal value instead of a parameter - e.g.: <b> nft -- add ... priority -100</b></li><li>https://www.man7.org/linux/man-pages/man1/bash.1.html</li></ul></ul></div><h3 style="text-align: left;">Creating the Table</h3><div>In nftables, a table contains a set of related chains, so that's the first required part.</div><div><ul style="text-align: left;"><li>Syntax: <b>nft [command] [object_type] [family] [table_name]</b></li><li>Command: <b>nft add table ip nat_all_to_network2</b></li></ul></div><div>Note: The "ip" family means this rule only affects ipv4 packets. "inet" would include ipv6 too.</div><div>Note: Commands to add chains and rules do not need to repeat the [family] part.</div><div><br /></div><h3 style="text-align: left;">Adding Chains</h3><div>Getting the table to process the right packets needs two chains which hook into prerouting and postrouting phases of packet handling with a chain type of "nat" (which means it only really examines the first packet of a connection to decide what to do with all of the packets that follow).</div><div>Note: Other hook types like "filter" continue evaluating each individual packet.</div><div><ul style="text-align: left;"><li>Syntax: <b>nft [command] [object_type] [table_name] { type [chain_type] hook [hook_phase] priority [priority_value] ; }</b></li><li>Command (prerouting): <b>nft -- add chain <b>nat_all_to_network2</b> pre_rt { type nat hook prerouting priority -100 \; }</b></li><li>Command (postrouting): <b>nft add chain <b>nat_all_to_network2</b> post_rt { type nat hook postrouting priority 100 \; }</b></li></ul></div><div>Note: The semicolon must be escaped so the shell/terminal won't treat it as a multiple-command-separator.</div><div>Note: The -100 and 100 priority values map to "special" values named dstnat and srcnat, respectively, which is how they appear when the table is viewed with <b>nft list ruleset</b></div><div>For information overload about this, see: https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks</div><div><br /></div><h3 style="text-align: left;">Adding Rules</h3><div>The final part of setting up the table is to specify the circumstances when a packet should be evaluated, and what to do with it if it matches various attributes.</div><div>The prerouting chain needs a rule that limits the table to evaluate and process only packets coming from the inbound interface</div><div><ul style="text-align: left;"><li> <b>nft add rule nat_all_to_iot_network pre_rt iifname "wlan0"</b></li></ul></div><div>The postrouting chain needs a rule that tells it to set up masquerading for packets that are being routed to the "outbound" interface.</div><div><ul style="text-align: left;"><li><b>nft add rule nat_all_to_iot_network post_rt oifname "eth0" masquerade</b></li></ul></div><h3 style="text-align: left;">Blocking Reverse Traffic</h3><div>When the default table in /etc/nftables.conf is loaded, there is a table for the inet family, named "filter", containing chains for input, forward, and output hooks. To prevent any host on the outbound side from forwarding packets to hosts on the inbound side, add a few rules to the forward chain in this table.</div><div><br /></div><div>First be sure the return packets from connections forwarded and masqueraded to the outbound side are still forwarded back.</div><div><ul style="text-align: left;"><li><b>nft add rule inet filter forward ct state {established, related} accept</b></li></ul></div><div>Next drop any packets originating on the outbound side, destined for the inbound side.</div><div><ul style="text-align: left;"><li><b>nft add rule inet filter forward iifname "eth0" oifname "wlan0" drop</b></li></ul></div><div>Packets that don't match one of those rules default to the chain's "policy accept"</div><h3 style="text-align: left;">Switching it On</h3><div>None of this will do anything unless packet forwarding is turned on.</div><div>To enable forwarding until the next reboot:</div><div><ul style="text-align: left;"><li><b>sysctl -w net.ipv4.ip_forward=1</b></li></ul><div>To make this permanent across reboots, edit <b>/etc/sysctl.conf</b> and add (probably just uncomment)</div></div><div><ul style="text-align: left;"><li><b>net.ipv4.ip_forward = 1</b></li></ul><div>To reload the config immediately (to see if everything is set for a reboot), enter commands:</div></div><div><ul style="text-align: left;"><li><b>sysctl -p</b> (to reload)</li><li><b>sysctl net.ipv4.ip_forward</b> (to check resulting setting)</li></ul></div><h1 style="text-align: left;">Persisting for the Next Boot</h1><div>After following these directions and testing to be sure packet forwarding is working as expected, the table, chains and rules are just in volatile memory and will vanish upon reboot. </div><div><br /></div><div>To persist a table, so it is re-activated every time the system starts, it needs to be added to <b>/etc/nftables.conf. </b> The format of the tables in the config file is <i>approximately</i> the same as the output of the <b>nft list ruleset</b> command.</div><div><ul style="text-align: left;"><li>Note: Special-value priorities displayed in the <b>nft list ruleset </b>command output are shown with their names (e.g. dstnat instead of -100, and srcnat instead of 100). <b>nftables.conf</b> must have the numeric values, since it doesn't seem to have a mapping from the names back to their numeric equivalents.</li><li>Note: Many tutorials found on the internet set up the initial rules locked to a particular network interface using <b>iif </b>and <b>oif</b>. From the ntf command-line, the interface names seem to be translated into their index values, but in <b>nftables.conf</b>, values like eth0 and wlan0 are actually <b>iifname </b>or <b>oifname</b>, so it is better to set up the rules using those attributes to begin with.</li><ul><li>See comment on Nov 6, 2023 here: https://superuser.com/questions/1815386/internet-connection-activ-only-after-restart-of-nftables</li></ul></ul><div><br /></div></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><p></p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-58887882158503981692023-12-22T10:29:00.000-08:002023-12-22T10:34:34.971-08:00OpenWRT, dnsmasq, dhcp, static mappings, but No DNS Resolution<h1 style="text-align: left;">The Problem</h1><p>After poking around WAYYYYY too long to connect these dots, I finally have a reasonable explanation for why dnsmasq, running on on OpenWRT, <b>absolutely refused to resolve an IP address from a hostname</b> that was configured, in DHCP, with an IP for a specific client mac address. The client machine was online, and reachable by that IP.</p><h1 style="text-align: left;">TL/DR</h1><p>dnsmasq only resolves names from DHCP <b><span style="color: red;">active </span></b>leases, not from DHCP config. (Read on if you need to know how to check, how to fix, etc.)</p><h1 style="text-align: left;">The circumstances were:</h1><p></p><ul style="text-align: left;"><li>ip/name configured in DHCP for client machines mac address (as mentioned already).</li><li>client machine hostname configured to match the name also assigned by DHCP</li><li>client machine (linux) had been rebooted, after configuring DHCP and hostname</li><li>command <b>dhclient -r</b> issued repeatedly on the client machine</li><li>interface, domain, etc. set to "lan"</li><li>ipv6 disabled (just in case it was making things more complicated).</li><li><b>ping </b>and <b>nslookup </b>from a different machine received NXDOMAIN response from dnsmasq/openwrt</li></ul><p></p><h1 style="text-align: left;">Extra Circumstances (that didn't seem relevant, but were):</h1><p></p><ul style="text-align: left;"><li>client machine had unexpired, cached DHCP lease info in <b>/var/lib/dhcp/dhclient.eth0.leases</b></li><li>openwrt dhcp did NOT have an active lease registered in <b>/tmp/dhcp.leases</b></li><li>dnsmasq had been restarted, the entire openwrt router had been restarted, and several updates had been "Saved and Applied" via LuCI. This probably meant that any DHCP in-memory name:ip mappings were gone.</li></ul><p></p><h1 style="text-align: left;">What fixed it?</h1><p></p><div>On the client/host machine that can't be resolved/found by name...</div><ol style="text-align: left;"><li>Delete <b>/var/lib/dhcp/dhclient*.leases</b></li><li>Reboot (because <b>dhclient -r eth0 </b>didn't help).</li></ol><p></p><h1 style="text-align: left;">Verification</h1><p></p><ol style="text-align: left;"><li>Check that <b>ping </b>and <b>nslookup </b>now work as expected from other clients for the previously (let's hope) unresolvable hostname.</li><li>Check that openwrt <b>/tmp/dhcp.leases</b> DOES now include a line for the recently, forcibly-renewed DHCP lease.</li></ol><h1 style="text-align: left;">Explanation:</h1><div>openwrt runs dnsmasq with a configuration that references the <b>/tmp/dhcp.leases</b> file. </div><div><ul style="text-align: left;"><li>The setting is found on the <b>Network - DHCP and DNS</b> page in LuCI, on the <b>Resolv and Hosts Files</b> "tab" in the <b>Leasefile </b>field.</li><li>The setting is found in the <b>/etc/config/dhcp</b> file in the <b>config dnsmasq</b> section as <b>option leasefile '/tmp/dhcp.leases'</b></li><ul><li>See: https://openwrt.org/docs/guide-user/base-system/dhcp</li><li>This says: "<i>leasefile stores leases in a file so they can be picked up again if dnsmasq is restarted.</i>"</li></ul></ul><div><span> </span><br /></div></div><p></p><p><br /></p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-43734513541773652762023-12-18T08:16:00.000-08:002023-12-18T08:16:28.662-08:00Gogs: Internal Error from "git push"<p>This might have been fixed in Gogs, and maybe it just got me because I'm just running an older version, but I think it's worth a quick post here anyway...</p><h1 style="text-align: left;">Problem</h1><p>Pushing a git repository to a remote hosted in Gogs... with ssh config, etc. all as it should be... results in:</p><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><p><span style="font-family: courier;"><b>me@myworkstation#:~/mylocalgitclonedir $</b> git push</span></p><p><span style="font-family: courier;">Gogs: Internal error</span></p><p><span style="font-family: courier;">fatal: Could not read from remote repository.</span></p><p><span style="font-family: courier;"><br /></span></p><p><span style="font-family: courier;">Please make sure you have the correct access rights</span></p><p><span style="font-family: courier;">and the repository exists.</span></p></blockquote><h1 style="text-align: left;">Cause</h1><p><span style="font-size: large;">It turned out to be <b>root:root </b>ownership of the <b>xorm.log</b> file on the Gogs server.</span></p><p>In my case, running in a docker container, that was <b>/app/gogs/log/xorm.log</b></p><p>This might be related: https://github.com/gogs/gogs/issues/4990</p><p>Don't know how this got changed in my particular setup... yet. Maybe a backup or log rotation hiccup.</p><p>So, the cause was <b>not</b>: (including some of this for searchability of this article)</p><p></p><ul style="text-align: left;"><li>repository write permissions for user</li><li>SSH config on server or client</li><ul><li>i.e. not an ssh client known_hosts error</li><li>i.e. not related to private key file permissions on the client</li><li>i.e. not using the wrong private key for the registered public key in gogs</li><li>checked with command: <b><span style="font-family: courier;">ssh -v -T git@mygogshost</span></b></li></ul></ul><p></p><h1 style="text-align: left;">Solution</h1><p>Open a terminal on the gogs host, and...</p><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"><p style="text-align: left;"><b><span style="font-size: large;">sudo chmod git:git /app/gogs/log/xorm.log</span></b></p></blockquote><p>After that git push worked fine again.</p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com1tag:blogger.com,1999:blog-3279772827714743698.post-61775213281903693812023-12-05T11:09:00.000-08:002023-12-05T11:09:04.239-08:00HomeAdvisor.com Password Reset<p>This info is current as of Dec 5, 2023, so if you're reading this later, and that was ages ago, it's not likely to be correct still. So, with that said...</p><p>I just had the "wonderful" experience of trying to get logged in to HomeAdvisor.com on a mobile browser after initiating an account from a desktop web browser.</p><p>Their "clever" scheme to use a temporary login link, sent to an email address, instead of a password, makes it impossible to <b>CHANGE</b> your password once you are logged in, because you might have <b>NEVER SET</b> a password. The "Forgot Password" link just sends you the non-password login link again... which is just another trip around their endless loop.</p><p>Called customer support and described the issue, and they just hung up on me, which might be an indication of whether you'd even want to work with HomeAdvisor/Angi in the first place.</p><p>The only way I could get out of the "catch 22" they created on the HomeAdvisor.com site, was to guess that maybe all of the the accounts are wired into the same place as Angi.com. So, if you go to Angi.com's login page: https://www.angi.com/login , you'll find a "Forgot Password? link that still goes to another page, which asks for your email address (i.e. login id), and actually sends you a link to reset your password on angi.com. Magically, that <b>ALSO </b>sets your password on HomeAdvisor.com.</p><p>Since the idiots in customer support can't be bothered to help anyone figure out the !@#$% mess they've made of the logins between HomeAdvisor.com and Angi.com, I hope this helps, at least until they fix it, or (more likely) make it into an even bigger mess.</p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-29076453187592191032023-10-13T08:21:00.001-07:002023-10-13T08:21:24.918-07:00Legacy NVIDIA Driver for Ubuntu 20.04+<h1 style="text-align: left;">Summary</h1><p>Either because an upgrade wrecked a working Linux install, or because the default drivers aren't performing very well, it may be necessary to install NVIDIA drivers for very old, "legacy" hardware on Ubuntu, or a similar Linux distribution. This post is meant to help get that done without burning as much time searching for the right information and putting all the pieces together.</p><h1 style="text-align: left;">Symptoms</h1><p></p><ul style="text-align: left;"><li>After an update / upgrade, Linux stalls mid-boot with a black screen and a blinking text cursor in the upper left corner.</li><li>Linux installed on a machine with older / legacy NVIDIA hardware is running too slow to be usable, and the graphics driver is suspected as the cause.</li></ul><p></p><h1 style="text-align: left;">Elements of the Problem</h1><p></p><ul style="text-align: left;"><li>Recent versions of Ubuntu install a kernel version that is no longer compatible with older NVIDIA drivers.</li><li>The default, generic driver doesn't perform very well (or at all) with older NVIDIA graphics card hardware.</li></ul><h1 style="text-align: left;">Getting to a Terminal</h1><div>When/if the X-Window / GUI Startup failed and stopped the bootup, it may be necessary to switch to another tty/terminal. There are typically several of them started with Linux, and they can be accessed using <b>CTRL+ALT+F2</b> (or F3, F4, ...). From the blank / black screen with the blinking cursor, use that key combo to switch over and directly log-in to a terminal / tty, where the commands below can be executed.</div><h1 style="text-align: left;">Diagnostic Steps</h1><div><ul style="text-align: left;"><li>Verify old NVIDIA hardware</li><ul><li>Command: <b style="font-family: courier;">sudo lspci | grep VGA</b></li><ul><li>Should display information about the NVIDIA hardware (e.g. GeForce 9600M GT)</li></ul></ul><li>Verify old, no longer working, NVIDIA driver version is installed - (e.g. 340.108)</li><ul><li>Command: <b><span style="font-family: courier;">dkms status</span></b></li><li>Command: <span style="font-family: courier;"><b>apt list --installed | grep nvidia</b></span></li><ul><li>Should show the NVIDIA driver package version (e.g. nvidia-340 ... 340.108)</li></ul></ul><li>Verify NVIDIA driver is malfunctioning</li><ul><li>Command: <b><span style="font-family: courier;">nvidia-smi</span></b></li><ul><li>Should report a failure to communicate with graphics hardware.</li></ul></ul><li>Check NVIDIA settings</li><ul><li>Command: <b><span style="font-family: courier;">nvidia-settings</span></b></li><ul><li>May report config errors, etc. and/or other useful info.</li></ul></ul></ul></div><h1 style="text-align: left;">Elements of the Solution</h1><div><ul style="text-align: left;"><li>Add the PPA repository from user kelebek333 which contains a version of the NVIDIA drivers that has been patched to work with newer kernel versions.</li><ul><li>See: https://launchpad.net/~kelebek333/+archive/ubuntu/nvidia-legacy</li><li>Command: <b><span style="font-family: courier;">sudo add-apt-repository ppa:kelebek333/nvidia-legacy</span></b></li></ul><li>Run command: <b><span style="font-family: courier;">sudo apt-get update</span></b></li><ul><li>This should report that one or more packages (which include patched NVIDIA driver) are upgradable.</li><ul><li>Verify w/ command: <b><span style="font-family: courier;">apt list --upgradable</span></b></li></ul></ul><li>Run command: <b><span style="font-family: courier;">sudo apt upgrade nvidia-340</span></b></li><ul><li>This may report that there is a public key missing. If so, run the following command replacing <i><span style="font-family: courier;">{key-value}</span></i> with the key that is reported in the error message from apt upgrade...</li><ul><li>Command: <span style="font-family: courier;"><b>sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <i>{key-value}</i></b></span></li></ul></ul><li><span style="font-family: inherit;">Reboot - If this resolved the NVIDIA driver issues, the X Window system should start normally again.</span></li></ul></div><p></p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-54110260598748896002022-11-29T12:47:00.000-08:002022-11-29T12:47:42.251-08:00Docker "exec format error"<h2 style="text-align: left;">Overview</h2><p>Occasionally, for a variety of reasons, a Docker container won't start, and the only clue is a cryptic message that says something like this:</p><p><span style="font-family: courier;"><b>standard_init_linux.go:178: exec user process caused "exec format error"</b></span></p><p><span style="font-family: inherit;">I'm aware that there are numerous related forum posts to be found via web search with a collection of right, wrong, confusing, and sometimes tediously wordy responses. This is just an attempt to cut through some of that and cover only the non-wild-goose-chase stuff, not to take credit for any of it. If any of this ended up worded similarly to something else, it's purely coincidence.</span></p><h2 style="text-align: left;">Cause #1 - Missing "shebang" in Shell Script</h2><p>Sometimes, this is related to an improperly authored shell script, serving as the entrypoint for the container image, and the solution is to add the required "shebang" (#!/bin/sh) line at the top of the shell script.</p><h3 style="text-align: left;">Troubleshooting</h3><div><ol style="text-align: left;"><li>Run the image as a "shell" container and examine the entrypoint script <br /><b><span style="font-family: courier;">docker run --rm -it --entrypoint [] myimagename:myimagetag /bin/sh</span></b></li><li><span style="font-family: inherit;">(Possible) Solution: Rebuild the container image with a corrected script</span></li></ol></div><h2 style="text-align: left;">Cause #2 - Image/Runtime Platform Mismatch</h2><p>The <b>other</b> main reason for the "exec format error" is that the platform for which the container image was built does <b>not</b> match the platform where the container is running.</p><p>This could be related to how the image was fetched / staged. For instance, using "docker pull" from a public registry and "docker push" to a private registry, using a <b>Macbook with an M1 processor</b> (arm64 platform) when the container will be run in a kubernetes system that is on amd64 (intel compatible) hardware and/or virtual machines.</p><p></p><ul style="text-align: left;"><li>Note: When the docker image entrypoint references a binary executable (not a startup shell script... i.e. no chance of missing "#!/bin/sh"), it is more likely that the "platform mismatch" is the cause of the "exec format error".</li><li>Note: If the source registry does not have an image matching the client/target platform (e.g. on a Raspberry Pi Arm 32bit OS), docker pull might fetch an image with a "best match" platform, which won't work (wrong exec format). This is the toughest one to fix, since it might require a full recompile of some binary executable files and probably demands building a new image up from multiple layers down.</li></ul><p></p><h3 style="text-align: left;">Troubleshooting</h3><p></p><ol style="text-align: left;"><li>Check the image platform<br /><span style="font-family: courier;"><b>docker image inspect myimagename:myimagetag |grep -i architecture</b></span></li><li>Check the runtime platform <br /><b style="font-family: courier;">docker version |grep -i arch</b><br /><span style="font-family: inherit;">or</span><br /><b style="font-family: courier;">kubectl version |grep -i server</b></li><li>(Possible) Solutions</li><ol><li>Pull the image with the platform that matches the target runtime environment<br /><b style="font-family: courier;">docker pull --platform linux/amd64 myimagename:myimagetag</b><br /><span style="font-family: inherit;">...then push again to the target registry to overwrite/replace the wrong-platform image.<br />See: https://docs.docker.com/build/building/multi-platform/</span></li><li>Rebuild the image starting from the correct base image<br />Modify Dockerfile and add --platform argument to the FROM line.<br />See: https://docs.docker.com/engine/reference/builder/#from</li></ol></ol><p></p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-84611311825649788492022-09-26T11:37:00.002-07:002022-09-26T11:38:19.695-07:00MacOS Display Derangement<h2 style="text-align: left;">Overview</h2><p>The title is intentional, because MacOS falls short of actually accomplishing display <b>ar</b>rangement in some circumstances.</p><h2 style="text-align: left;">Circumstances</h2><p>When multiple monitors of certain brands and models are plugged into a MacBook, the part of MacOS that derives a "unique" identifier for each monitor fails to distinguish between them. The HP E243 is one example, but there may also be other brands/models that reveal this flaw in MacOS' handling of external monitor identification. Since MacOS cannot tell which specific display was previously arranged in a particular position (relative to the internal display, or other external displays, or each other), the overall arrangement sometimes gets mangled. The only common way to re-arrange the monitors is by way of the cumbersome "System Preferences -> Displays" dialog in MacOS.</p><h2 style="text-align: left;">Remedy</h2><p>After years of searching for a reasonable solution to this issue, and hoping Apple would get it fixed (but has not as of Monterey / 12.6), I finally found, sorta by accident, a command line utility (the best kind IMO) with the source code published on Github, called DisplayPlacer. DisplayPlacer removes "most" of the annoyance of this Apple MacOS bug. It still requires a manual step (running a command/script) to force displays back into a captured/desired arrangement, but is WAYYYYYYYY better than using the MacOS "System Preferences -> Displays" UI every time.</p><h2 style="text-align: left;">Steps</h2><p></p><ul style="text-align: left;"><li>Install displayplacer (brew tap instructions on the github repo)</li><ul><li>https://github.com/jakehilborn/displayplacer</li></ul><li>Arrange displays using the MacOS System Preferences -> Displays (yup... one last time)</li><li>Run <b>displayplacer list</b> and copy/capture the displayplacer command that is printed to the console, which contains all of the distinct display ids, resolutions, refresh rates, and relative positions.</li><li>Create a shell script containing the captured command.</li><li>Whenever MacOS !@#$% the display arrangement again, run the shell script to pop everything back where it is supposed to go.</li></ul><h2 style="text-align: left;">Conclusion</h2><div>This isn't my utility. The author Jake Hilborn had done us all a favor by making MacOS less annoying while we all continue to wait, maybe indefinitely, for Apple to finally acknowledge this is a problem and fix it themselves. I would recommend sending Jake a thank you, or maybe find a way to buy him a cup of coffee (or similar). I only posted this so there will be yet one more way some of you might end up finding Jake's excellent work, and maybe end some of your frustration with the display "derangement" on your MacBook.</div><p></p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-91243093467975211142022-05-29T09:58:00.007-07:002022-05-29T19:37:55.408-07:00Installing webCOrE for SmartThings (Android) - May 2022<h2 style="text-align: left;">Overview</h2><p>In the wake of several decisions by Samsung and possibly others, the SmartThings eco system is falling apart. This article sums up several of the answers for installing webCoRE in SmartThings as they are (were) in the spring of 2022.</p><p>Alert: If you are trying to do this on an iOS/Apple mobile device, this isn't likely to help you much. iOS devices aren't really a favorite of people who want to tinker with something like webCoRE anyway, and are generally VERY restrictive, so I'll just wish you luck finding a similar article, if such a thing exists, for your situation.</p><h2 style="text-align: left;">webCoRE - Why?</h2><p>Automations in the basic SmartThings app don't allow multiple actions on the same device. This limitation makes it impossible to do things like using an IOT plug to automate cycling the power off and on for something like an HP multifunction printer that puts itself permanently to sleep under unknown, random circumstances. webCoRE adds the ability to do more useful automations.</p><h2 style="text-align: left;">Installation Overview</h2><p>Instructions found in various places are based on previous versions of the SmartThings IDE (website), and/or previous versions of the SmartThings (Android) mobile app, so the screenshots and instructions often don't match up to current reality. Even this article will, without a doubt, become obsolete when Samsung moves things around once again. In the interest of minimizing that "rot" factor, I'm leaving out details for how to do various steps but including enough key words to search the web and find instructions.</p><p>The installation process for webCoRE is supposed to be a few simple steps as follows:</p><p></p><ol style="text-align: left;"><li>Add the SmartApps to the SmartThings IDE</li><ul><li>Option 1: Create each of the 4 webCoRE components "from code" and copy/paste the source code into the online editor.</li><li>Option 2: Integrate SmartThings with GitHub, and install each of the 4 webCoRE components from the ady624 GitHub repository.</li></ul><li>Add a named "instance" of webCoRE within the SmartThings app with access to the devices, sensors, etc. that the instance may control.</li><ul><li>This is where Samsung has made things really obscure and difficult.</li></ul></ol><p></p><h2 style="text-align: left;">Installation "Gotcha's"</h2><h3 style="text-align: left;">SmartThings Classic is Discontinued</h3><div><ul style="text-align: left;"><li>The user interface in SmartThings Classic made it <b>far</b> clearer and easier to install SmartApps, but it is defunct, and the "new" version of the SmartThings app, at least on Android, tries its best to bury and hide the SmartApps functionality.</li><li>If your Android device is pre-"Oreo" (pre Android 8.0), this is probably already a source of frustration, since the "New" SmartThings app won't even install/run. For instance, a Samsung Galaxy-S 5 makes a pretty good smart remote for IOT stuff, but you'd have to go to some trouble to get Android 8.0 or later installed on it.</li></ul><h3 style="text-align: left;">Steps to install a SmartApp in the "New" version of SmartThings</h3></div><div><ul style="text-align: left;"><li>Enable Developer Mode - The option to create a SmartApp won't even show up without doing this first.</li><ul><li>At the moment, this is done by </li><ul><li>opening the settings (gear icon displayed when the "Menu" page/tab is selected).</li><li>scrolling down to "About SmartThings" and tapping it for 5+ seconds</li><li>scrolling farther down to see, and toggle on "Developer mode"</li></ul></ul><li>Dive Into the Menus to find where they hid the SmartApp option</li><ul><li>At the moment, this is done by</li><ul><li>switching to the Automations page/tab</li><li>clicking the "+" icon and choosing "Add routine"<br /></li><li>switching to the "Discover" page/tab</li><li>scrolling all the way to the bottom and selecting the main webCoRE SmartApp (not the dashboard, piston, or storage items)</li><ul><li>Note: These will only appear if they were previously added in the SmartThings IDE</li></ul></ul></ul></ul><h3 style="text-align: left;">Location</h3></div><div><ul style="text-align: left;"><li>webCoRE refuses to install unless the Location is properly set in SmartThings.</li><li>Location was apparently managed in the Menu-Settings at some point, but currently, it is "hidden" on the "Favorites" page/tab</li><ul><li>tap the location name (e.g. "Home")</li><li>select "Manage Locations" (gear icon)</li></ul><li>Even if a geolocation is set, it may be too broad for webCoRE to be happy with it, so try reducing the radius, if webCoRE refuses to install.</li></ul><h2 style="text-align: left;">References</h2></div><div>* https://community.webcore.co/t/installation-trouble-webcore-your-location-is-not-correctly-setup/20079</div><div>* https://community.smartthings.com/t/faq-did-we-lose-the-ability-to-add-custom-smartapps-after-the-app-update-of-june-2021/227734</div><div>* https://community.smartthings.com/t/alternatives-to-smartthings-ecosystem-2021/227572/3</div><div>* https://www.youtube.com/watch?v=y_ElUwmmI6Y (overview of install with several outdated screenshots and instructions)</div><div>* https://www.reddit.com/r/SmartThings/comments/jwqskf/automations_more_than_one_action_for_the_same/</div><div><br /></div>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-2189284612339716242022-03-22T12:12:00.001-07:002022-05-10T09:27:18.890-07:00Mangled Metaphors and Corrupted Cliché's<p>This is a selection of entertaining mixed or mangled trite phrases (cliché's) that I remembered or saved along the way.</p><h1 style="text-align: left;">The Original Set</h1><p style="text-align: left;"></p><ul style="text-align: left;"><li><b>"It's not like I'm taking money out of anyone's mouth."</b></li><ul><li>Context: This was stated during a conversation about the ethics of using software without paying for a license, or what Bill Gates likes to over-dramatically call "pirating" it.</li><li>Contributing Cliché: "taking money out of someone else's pocket"</li><li>Contributing Cliché: "taking food out of someone else's mouth"</li></ul><li><b>"That will be the needle that broke the haystack."</b></li><ul><li>This was stated by someone who fumbled nearly everything they tried to say, but still tried to inject a colloquial saying here and there, to try making their point even more ridiculous.</li><li>Contributing Cliché: "the straw that broke the camel's back"</li><li>Contributing Cliché: "finding a needle in a haystack"</li></ul><li><b>"It's just a blimp on my radar."</b></li><ul><li>Said by someone who didn't start life speaking English, so... good try. I suppose, depending on whether the blimp is made of radar-reflective material, this could be ironic, or it could just be absurd. Funny either way.</li><li>Contributing Cliché: "a 'blip' on radar"</li></ul><li><b>"I'll let you bury your own hole."</b></li><ul><li>Context: This was a feeble attempt to declare intent not to interfere in someone else's conflict. M.C. Escher probably would have tried to paint a picture of this.</li><li>Contributing Cliché: "dig yourself deeper into a hole"</li><li>Contributing Cliché: "bury a bone / body / problem /etc."</li></ul><li><b>"If I were you, I wouldn't hedge your bets."</b></li><ul><li>Context: Hedging is a somewhat negative notion (betting against yourself), so this was a double negative in a way, but if taken literally, it is at least bad advice. The application of pronouns is also a little hard to parse.</li><li>Contributing Cliché: "I would hedge my bets"</li></ul><li><b>"If you need me, I'll be out rattling some more trees."</b></li><ul><li>Context: Reasonably sure this was intended to mean the person planned to talk to additional contacts about something.</li><li>Contributing Cliché: "rattling some cages" (perturbing captive animals)</li><li>Contributing Cliché: "shaking some trees" (attempting to dislodge fruits or nuts growing on the tree)</li></ul><li><b>"I don't have a horse in this fight."</b></li><ul><li>Context: The person was surely intending to say he didn't have a stake or interest in the outcome of an argument.</li><li>Contributing Cliché: "have a dog in the fight" (reference to the practice of dog fighting)</li><li>Contributing Cliché: "have a horse in the race" (reference to a sport in which horses are more commonly used)</li></ul><li><b>"We'll cross that bridge when it gets here."</b></li><ul><li>Context: From a certain relative-motion perspective, this isn't necessarily an incorrect way to suggest waiting until a decision point is reached to actually make the decision, but...</li><li>Contributing Cliché: "cross that bridge when we come to it"</li></ul><li><b>"It's a great place to flex those wings."</b></li><ul><li>Context: Attempt to describing an "practice environment" which is particularly conducive to improving skills and increasing knowledge.</li><li>Contributing Cliché: "flex your muscles" (demonstrate strength)</li><li>Contributing Cliché: "spread your wings" (expand upon basic abilities and develop them in a place with fewer constraints / guardrails)</li></ul></ul><p></p><h1 style="text-align: left;">New ones...</h1><p></p><ul style="text-align: left;"><li><b>"Easy Hanging Fruit"</b></li><ul><li>Context: Discussion of most beneficial tasks to prioritize based on relative cost/benefit</li><li>Contributing Cliché: "low hanging fruit"</li><li>Contributing Cliché: "easy" (as generally used to describe something requiring little effort)</li><li>Commentary: As mangled, this cliché starts to sound a bit risqué.</li></ul></ul><p></p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-40892667585770110882022-01-07T13:07:00.005-08:002022-01-07T13:20:10.089-08:00Irritating Paypal Website Bug - Quick Security Check<h1 style="text-align: left;">Summary</h1><p><span style="font-size: medium;">When setting up Paypal as a method of payment, for instance, from Coinbase, in some circumstances, Paypal will prompt for a "Quick security check." If there isn't a qualifying phone number <b>already</b> associated with the Paypal account, the prompt will also display "Please add a phone" with a link labeled "Add phone."</span></p><p><i>Note: What makes a number valid for use in the "Quick security check" doesn't seem to be clearly explained. Based on (speculative) comments in some related forum discussions, it seems the key is that the name associated with the number in the CNAM (telco) directory database matches the name on the Paypal account. Google Voice numbers seem to have no such entry, and therefore can't be used for this. A physical mobile account with one of the major U.S. providers (Verizon, T-Mobile, ATT, etc.) seems to be the only option.</i></p><p><span style="font-size: medium;">The trouble is caused when the size of the popup box for Paypal verification is not big enough to display the form to enter the phone number. Clicking "Add phone" appears to do <b>nothing</b>. To me, this falls somewhere between frustrating and infuriating. </span></p><p><i>Note: The instructions here are primarily applicable to Windows 10 with a current/recent version of Google Chrome browser, so other OS's and/or other browsers may work a little differently.</i></p><h1 style="text-align: left;">What it Looks Like</h1><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEilpfQo_PjPOTaN3r_iCYmEVzyZBuTvfj1dOWirLbsqEpu7D43OBPeSExszOJkvN0ezxi-BBrtKrsk-6hP25x3kNK9y2xQSukp_0EY237Evkno5sZOYmEtwvzkPGog4652TAu0GpONsqWuE5MhjGrMFx0aw_rhdXcvl3RZY-rG1oMTg55w6UuXKV36E=s1115" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="801" data-original-width="1115" height="443" src="https://blogger.googleusercontent.com/img/a/AVvXsEilpfQo_PjPOTaN3r_iCYmEVzyZBuTvfj1dOWirLbsqEpu7D43OBPeSExszOJkvN0ezxi-BBrtKrsk-6hP25x3kNK9y2xQSukp_0EY237Evkno5sZOYmEtwvzkPGog4652TAu0GpONsqWuE5MhjGrMFx0aw_rhdXcvl3RZY-rG1oMTg55w6UuXKV36E=w616-h443" width="616" /></a></div><br /><h1 style="text-align: left;">Workaround</h1><p><span style="font-size: medium;">1. Right click (or whatever the equivalent is in your OS + web browser) the title bar of the popup dialog window and choose "Show as tab"</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg-UnXAD_tip2qg_2jgdf1RFuLB5CysXHGU5Cr-EiqxYXrjvdXLm7l9urE5TOyyOwc12Dmcemf7NOr5L0Of-FQLWFi1RwG___vjTMpXYi_JYezItbm7VxpoqUL2Fl6VQJyOAc8xoCDyXgvgFTcjFxY3mjKU30DsWj4loSS9xuTH2u1ujGEGipu1FwA6=s1119" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="798" data-original-width="1119" height="374" src="https://blogger.googleusercontent.com/img/a/AVvXsEg-UnXAD_tip2qg_2jgdf1RFuLB5CysXHGU5Cr-EiqxYXrjvdXLm7l9urE5TOyyOwc12Dmcemf7NOr5L0Of-FQLWFi1RwG___vjTMpXYi_JYezItbm7VxpoqUL2Fl6VQJyOAc8xoCDyXgvgFTcjFxY3mjKU30DsWj4loSS9xuTH2u1ujGEGipu1FwA6=w524-h374" width="524" /></a></div><br /><p><span style="font-size: medium;">2. Resize the "tabbed" window to be sure it is wide enough to show the form to the right of the "Add phone" link, where there is another link with a "+" icon beside it, also labeled "Add phone."</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhZUMDUVfbSwXKIOvVNjmcI-y855OZmVXif8kDsOgTh1uNCMWDLV079N0wkI5R4OD8Y6wTeRLrTZU6KkDWfj2pmOnzidePmBPO9sRQjB_fg1GGG0geGiCy9v5nfhF4NlYQMfvV2xKjxaExc9GROkD-9ZcJNAlN753ZpCt60VOkPcHzm2a7V162EXDvb=s1366" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="765" data-original-width="1366" height="322" src="https://blogger.googleusercontent.com/img/a/AVvXsEhZUMDUVfbSwXKIOvVNjmcI-y855OZmVXif8kDsOgTh1uNCMWDLV079N0wkI5R4OD8Y6wTeRLrTZU6KkDWfj2pmOnzidePmBPO9sRQjB_fg1GGG0geGiCy9v5nfhF4NlYQMfvV2xKjxaExc9GROkD-9ZcJNAlN753ZpCt60VOkPcHzm2a7V162EXDvb=w577-h322" width="577" /></a></div><p><i>Note: This is really where the bug exists. If the window is sized too small/narrow, the form that actually allows adding a phone just disappears.</i></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhvBh0WWuKQTBD1_-_CGyqmg-pVW20VqKZlhefWDD2MpHMpcJI_lV1Or-K1OWwR2rdUAqaWzkvFkbS1lZjTbLbc7Z2Ua61FGfo6o1q_f08OXDm0ydMs0hJjTOMaQ3EK-BRD0SQg30zYPvyI3ZLyxdBjmH8qchnPatxvEyOt3b5sTAflIDSBovjDb6cp=s1213" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="711" data-original-width="1213" height="353" src="https://blogger.googleusercontent.com/img/a/AVvXsEhvBh0WWuKQTBD1_-_CGyqmg-pVW20VqKZlhefWDD2MpHMpcJI_lV1Or-K1OWwR2rdUAqaWzkvFkbS1lZjTbLbc7Z2Ua61FGfo6o1q_f08OXDm0ydMs0hJjTOMaQ3EK-BRD0SQg30zYPvyI3ZLyxdBjmH8qchnPatxvEyOt3b5sTAflIDSBovjDb6cp=w601-h353" width="601" /></a></div><br /><div><br /></div><p><span style="font-size: medium;">3. Finally, click the "+ Add Phone" link to display the text field that allows a phone number to be typed in. From here, things work as expected</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhWioPrXV0YVPT5GTTZuTPtK3h6Z_VT0SFGboNC-GGhx5EUEIuicbQDA6xjjS_Xo9AhHEwGw_Dzsqa3X0mjvGpufHYCMaV4C5XHyV64D0skpWkS-YEVDEd--jt_4UOnZGqiQ3msdepr_IvIH1igMBsSoZGr7vD3dj_NzOvRPCHKEGqX8tbKrrpbh8wU=s1370" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="805" data-original-width="1370" height="331" src="https://blogger.googleusercontent.com/img/a/AVvXsEhWioPrXV0YVPT5GTTZuTPtK3h6Z_VT0SFGboNC-GGhx5EUEIuicbQDA6xjjS_Xo9AhHEwGw_Dzsqa3X0mjvGpufHYCMaV4C5XHyV64D0skpWkS-YEVDEd--jt_4UOnZGqiQ3msdepr_IvIH1igMBsSoZGr7vD3dj_NzOvRPCHKEGqX8tbKrrpbh8wU=w564-h331" width="564" /></a></div><br /><p>4. </p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-13264526940691206202021-12-13T21:23:00.007-08:002022-03-28T13:11:45.322-07:00Airbow Guard Cover - V2 Design Update<h1 style="text-align: left;">Design Update</h1><p><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgwD04iqdNohgHjtJPwXBM9ugFEQlpN_JExoNWFlQxH49w3Wr-XzcwyQXJSA2ZYfXiw9DF4eNkUvIjEhttLSqNcnWucVgolfKMQVZEPmnEbKK5rHV9shtaaF0VROGSUzYZwECPx6F6Y6eyC4uqGiKzo8KNfBL0yPgjB0NPxHL8BiuxneNs9udIjEQD9=s4624" style="clear: right; display: inline; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"><img border="0" data-original-height="3468" data-original-width="4624" height="228" src="https://blogger.googleusercontent.com/img/a/AVvXsEgwD04iqdNohgHjtJPwXBM9ugFEQlpN_JExoNWFlQxH49w3Wr-XzcwyQXJSA2ZYfXiw9DF4eNkUvIjEhttLSqNcnWucVgolfKMQVZEPmnEbKK5rHV9shtaaF0VROGSUzYZwECPx6F6Y6eyC4uqGiKzo8KNfBL0yPgjB0NPxHL8BiuxneNs9udIjEQD9=w304-h228" width="304" /></a>After several years of making the previous version of this gadget for various people around the world, I was forced to redesign it a little so that I could print the parts on a slightly smaller 3D printer, because the original printer I was using sorta started having too many problems. After I managed to make a few of the covers on the other printer, I decided to keep working on it a while and update the design with a few changes that I have thought about over the past few years.</p><p>Here's the blog post about the previous design: <a href="https://whirlysworld.blogspot.com/2018/01/benjamin-airbow-missing-accessory.html">https://whirlysworld.blogspot.com/2018/01/benjamin-airbow-missing-accessory.html</a> So, I won't repeat any of that stuff here. Most of what that post says hasn't changed. This post will just cover the design changes for "Version 2".</p><h1 style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><span><a name='more'></a></span><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg-JRyOPVesgX6aeX2zupAGkgnVY-cWM3l-NCmMkpmSI7uExguIG7oy5EMVcMGyC8N6kcGIETvrm4kHlmA5BxYmNZSNa3GhJ9OwI6PEKq6JMOepkPre5FXGCjAeJAdvMhrhrC2gUCnXnJ05DiV4ZTmB9tkB9I8fNh832hR0tG7fgVCs1CoQXRLsjX2z=s335" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="335" data-original-width="195" height="183" src="https://blogger.googleusercontent.com/img/a/AVvXsEg-JRyOPVesgX6aeX2zupAGkgnVY-cWM3l-NCmMkpmSI7uExguIG7oy5EMVcMGyC8N6kcGIETvrm4kHlmA5BxYmNZSNa3GhJ9OwI6PEKq6JMOepkPre5FXGCjAeJAdvMhrhrC2gUCnXnJ05DiV4ZTmB9tkB9I8fNh832hR0tG7fgVCs1CoQXRLsjX2z=w106-h183" width="106" /></a></div>Exterior Shape</h1><p><br />The original design was sorta crude in a few places. One of the things I just shrugged because it was "close enough" was the shape of the exterior shell. The new design has an exterior shape that matches the foregrip and arrow channel on the Airbow so it has a more professional look. The old design works just fine, but the outer round shape of the part that goes over the air tank doesn't mate up as cleanly with the lines on the Airbow.</p><h1 style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhE7Sy15L67Q6D1E64_ue0fWuI28J-mgIbB1CGp56zwc31F7ZkpJbN3kPMuWWzfHmZywFijo4OEs8a4lE7f3tzgap7cHt7BjysOljFGTrl0c93MYUXRU870CSh4WjrY6WjRd0J0LsBOfmvt7BXX-H4IQiXs5oDd3UEpplQe8v1tFDZtT04scC4_NJmY=s262" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="226" data-original-width="262" height="226" src="https://blogger.googleusercontent.com/img/a/AVvXsEhE7Sy15L67Q6D1E64_ue0fWuI28J-mgIbB1CGp56zwc31F7ZkpJbN3kPMuWWzfHmZywFijo4OEs8a4lE7f3tzgap7cHt7BjysOljFGTrl0c93MYUXRU870CSh4WjrY6WjRd0J0LsBOfmvt7BXX-H4IQiXs5oDd3UEpplQe8v1tFDZtT04scC4_NJmY" width="262" /></a></div><span><!--more--></span>Gauge Peep Hole</h1><p>One of the things that I would consider a VERY minor inconvenience is the need to remove the guard / cover to read the current amount of charge on the air pressure gauge. Originally, I just skipped putting a peep hole in because I didn't anticipate wanting to check the pressure that often anyway. The new design has a peep hole to read the gauge mainly because it didn't take that much effort to add it, and I figured, "why not?"<br /></p><h1 style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><span><!--more--></span><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgDErsgJMCZo6MdzLBK9g4OUK28beyqji1NJL_Nqg9w1G2YMvAXcc1lxVH1Onsl45cECDE3pCb0_h-qlPymZkOsAhJBUrBPY-ACe2eZFO6ioCe5RC7fge0TE5wRCTdJZqbjsBB8DTZl0cjbCW4f0wBYhgadF1QHNuJDNcSb4b3h3BsgzRwiMCGcxb1e=s267" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="267" data-original-width="183" height="267" src="https://blogger.googleusercontent.com/img/a/AVvXsEgDErsgJMCZo6MdzLBK9g4OUK28beyqji1NJL_Nqg9w1G2YMvAXcc1lxVH1Onsl45cECDE3pCb0_h-qlPymZkOsAhJBUrBPY-ACe2eZFO6ioCe5RC7fge0TE5wRCTdJZqbjsBB8DTZl0cjbCW4f0wBYhgadF1QHNuJDNcSb4b3h3BsgzRwiMCGcxb1e" width="183" /></a></div>Larger, Precisely Positioned Dovetail</h1><p>On the older design, I kept changing the shape of the "catch" part that clips into the picatinny rail, so I wouldn't know, from one print to the next, where exactly the catch would need to be positioned on the dovetail rail. So, I just left the rail longer than it needed to be, which is just another "less professional looking" aspect of the old design. The new design prints the dovetail rail exactly where it needs to be, without any extra length. The dovetail shape is also a little taller and terraced, which makes it a little easier to assemble (but that's only an issue for me when I'm making one).</p><h1 style="text-align: left;"><br /></h1><h1 style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjd6sOBaPA936I8pSWrwuYozZ3JabpQZUUz-nvgKenupmifuBj9P8JKj3vMwwb7ID_-dFaqtPks7AK2TPqo1hT_CGrQcalCfrgRNkKdz773iQcfMkDFwlPhdm1JGlzfpwZe8U3ZWY1gRxUKDNxb8Sa1JZdjGTD6upBITXmZI1GEDk15bnMyDOOjeaVT=s512" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="512" data-original-width="267" height="208" src="https://blogger.googleusercontent.com/img/a/AVvXsEjd6sOBaPA936I8pSWrwuYozZ3JabpQZUUz-nvgKenupmifuBj9P8JKj3vMwwb7ID_-dFaqtPks7AK2TPqo1hT_CGrQcalCfrgRNkKdz773iQcfMkDFwlPhdm1JGlzfpwZe8U3ZWY1gRxUKDNxb8Sa1JZdjGTD6upBITXmZI1GEDk15bnMyDOOjeaVT=w109-h208" width="109" /></a></div><span><!--more--></span>Flat Front</h1><p>This change is more of an enhancement for 3D printing than anything functional or aesthetic for the guard/cover itself. Without the notched-back part on the arrow tube cover part, there is no overhang that must be printed with support material underneath it, and there is less to clean up (where the support material is removed) after the part is printed.</p><h1 style="text-align: left;"><br /></h1><h1 style="text-align: left;"><br /></h1><h1 style="text-align: left;">Conclusion</h1><p>I made a new guard cover with this design for my own Airbow, for more "wow factor" when I take it to the range. From this point forward, I'll use this new design if someone asks me to make a cover for them. The materials, time, wear and tear on the printer (and my wife's nerves), and other supplies, etc. are all about the same as they were previously, so I'm sticking with the same price.</p><p>Also, I've set up one of those inexpensive e-commerce / shopping-cart sites to make it a little easier, than an email conversation, to get the shipping charges and Paypal part figured out. If you want to send me a request to make an "Airbow Guard / Cover V2" for you, give that a try here: https://whirlysworld.company.site/ </p><p>Here's the revised Youtube video for the V2 design:</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="340" src="https://www.youtube.com/embed/sD7BQHA5NmM" width="480" youtube-src-id="sD7BQHA5NmM"></iframe></div><br /><p><span style="background-color: white; color: #191919; font-family: "Proxima Nova", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; font-size: 16px;"><b>ALERT</b>: This is </span><span style="background: none rgb(255, 255, 255); border: 0px; box-shadow: none; box-sizing: border-box; color: #191919; font-family: "Proxima Nova", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; font-size: 16px; font-weight: 600; margin: 0px; max-height: none; max-width: none; min-height: 0px; min-width: 0px; opacity: 1; outline: none; padding: 0px; position: static; transform-origin: center center; transform: none; transition: none 0s ease 0s; z-index: auto;">NOT</span><span style="background-color: white; color: #191919; font-family: "Proxima Nova", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; font-size: 16px;"> meant to remain in place while shooting. It is only meant to protect the arrow tube and gauge while the Airbow is in storage or while it is being transported. It must be removed before loading and firing an arrow.</span></p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com1tag:blogger.com,1999:blog-3279772827714743698.post-44864079928846474532021-09-10T14:50:00.000-07:002021-09-10T14:50:03.869-07:00Arduino Pro Mini Vin/RAW vs. Vcc vs. FTDI <h1 style="text-align: left;">Goal</h1><div>Connect an Arduino Pro Mini such that external devices get their power from an external power supply, while the Pro Mini remains connected via FTDI to a USB port on a computer, for programming, and serial-monitor uses.</div><h1 style="text-align: left;">Challenges</h1><div><ul style="text-align: left;"><li>Powering the Pro Mini board + external devices totaling more than 200mA exceeds the rating for the on-board voltage regulator (VReg) on Vin/RAW.</li><li>Powering the Pro Mini board using Vin/RAW (i.e. VReg input > the board's operating voltage / 5v or 3.3v) sends voltage/current back, from the VReg output, through various routes, into the FTDI output pins, and in turn through the USB connector, risking damage to the USB port on a computer used for programming or a serial monitor.</li><ul><li>Note: Disconnecting the FTDI +5v pin prevents the FTDI from communicating with the Pro Mini, and doesn't block all the backflow paths anyway.</li></ul><li>Powering the Pro Mini board using its Vcc pin with an externally regulated voltage matching the board's operating voltage, basically attaches to the same "bus" as the output pin of the on-board VReg. This conflicts with input voltage from the USB/FTDI and <b>may</b> backflow current into the USB port.</li><ul><li>This might be tolerated, but still isn't an ideal, safe way to hook things up.</li></ul><li>Logic voltage to control high-power external devices (e.g. motor, LED-array, or loud buzzer) must use the same reference +/- voltage as the board, or HIGH and LOW might make no sense.</li></ul><h1 style="text-align: left;">Solution</h1></div><div><b><span style="font-size: medium;">While programming and developing, ONLY connect the GND of the external power supply to the GND of the Arduino Pro Mini, creating a common reference point for the Negative / NEG / "-" / Ground / 0v point, but _NO_ connection or conflict for the Positive / POS / "+" / Vcc.</span></b></div><div><br /></div><div>Later, in order to run the external devices directly from the external power supply, and separately <b>also</b> run the Arduino Pro Mini from the same external power supply, completely remove the FTDI/USB device, and connect the external power supply to the Pro Mini via the appropriate pin, Vcc or Vin/RAW.</div><div><br /></div><h1 style="text-align: left;">Explanation</h1><div>The reason this works is that the difference in potential (voltage) observed relative to GND is polarized / directional based on which way current flows in the circuit. If the GND reference point for <b>both</b> the board+USB <b>and</b> the external power supply are <b>tied together</b>, then the relative reference point for current flow, is also common.</div><div><br /></div><div>Transistors (typically used to allow low-current logic to control a higher current device) trigger (amplify) based on current flow, so it only matters that the signal (base) current flows the same direction as the load (collector/emitter) current. With the GND for both power sources (USB/FTDI and external) tied together, the current flow direction will match.</div><div><br /></div><h1 style="text-align: left;">Connection Scenarios</h1><div><ol style="text-align: left;"><li><b>Programming / Development / Debugging</b></li><ul><li>USB/FTDI Connected - supplies power to Arduino Pro Mini</li><li><b>Only</b> Arduino Pro Mini <b>GND</b> pin connected to external power supply GND</li><ul><li>i.e. Pos <b>NOT</b> connected</li></ul><li>Pos and Neg from external power supply connected to supply power on external devices</li></ul><li><b>Standalone</b></li><ul><li>USB/FTDI <b>NOT</b> connected to Arduino Pro Mini</li><li><b>Both</b> Pos and Neg from external power supply connected to Pro Mini Vcc and GND</li><li>Pos and Neg from external power supply connected to supply power on external devices</li></ul></ol><h1 style="text-align: left;">Disclaimer:</h1><div style="text-align: left;">The terminology used here, and maybe even some of the technical statements might not be expressed in the same terms as are used to explain electronics circuits and concepts elsewhere. This was just my attempt at explaining things the way it makes sense to me, so that when I forget how this works, I can use this as a reminder. Hope it helps someone else who is struggling with the same thing while developing with an Arduino Pro Mini.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Some of the discussions about this seem to go nowhere, or end in unresolved debate:</div><div style="text-align: left;"><ul style="text-align: left;"><li>https://forum.arduino.cc/t/power-the-pro-mini-through-vin-and-serial-ftdi-chip/317067 </li><li>https://forum.arduino.cc/t/connecting-5v-vcc-to-an-arduino-pro-mini-or-to-any-arduino/340382</li><li>https://electronics.stackexchange.com/questions/97184/how-to-power-arduino-pro-mini-via-vcc-pin-12v-input</li><li>https://forum.arduino.cc/t/powering-pro-mini-and-ftdi-serial-question/252020</li></ul></div></div>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-32029282100973805672021-02-23T17:51:00.003-08:002021-02-24T07:46:56.476-08:002010 Subaru Outback - LED Headlight Conversion<h1 style="text-align: left;"><br /> Overview</h1><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtxhcqwPrhswsN3u7x2fQtIvH2wET79T7bhASbJvNSd3rvSLsHME8XLz0PyRZQZ8pQuONrSuD5OoU3dbx80hHYZTkYzbyLc3HwbL37jhE9cqnsRFx7TuCjDs0NyXvgVmlKn20d4y0_sUo/s2048/20210219_161234.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1536" data-original-width="2048" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtxhcqwPrhswsN3u7x2fQtIvH2wET79T7bhASbJvNSd3rvSLsHME8XLz0PyRZQZ8pQuONrSuD5OoU3dbx80hHYZTkYzbyLc3HwbL37jhE9cqnsRFx7TuCjDs0NyXvgVmlKn20d4y0_sUo/w214-h161/20210219_161234.jpg" width="214" /></a></div>The Subaru Outback is a really popular car, right? There are millions of them on the road, right? Things that are annoying about popular cars get solved with aftermarket products after a while, don't they? Well, I'm puzzled, because the halogen lowbeam (H7) headlights on a 2010 Subaru Outback burn out WAY too often (every ~10 months in my recent experience), and they are an ENORMOUS pain to swap out. Yet, there seems to be no reasonable options to install LED headlight bulbs. I finally had enough, and spent some time designing my own solution. This post is meant to share what I did, so that maybe someone else will have a bit of a head start on the whole endeavor.<p></p><h1 style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-X_3-ueGUaydWZlqTkTNapAcYgzl6295D176QCE0DAbQa3RUX1uD4VeD6s5UPnINsZgUuwA3jbtMplJDXsg-Y_UIIi5JMB9xJqGiOM9i5PvwomHwn9KJvp05zahdNW7JhpcaoLGXW-Mg/s2048/20210219_172428.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1536" data-original-width="2048" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-X_3-ueGUaydWZlqTkTNapAcYgzl6295D176QCE0DAbQa3RUX1uD4VeD6s5UPnINsZgUuwA3jbtMplJDXsg-Y_UIIi5JMB9xJqGiOM9i5PvwomHwn9KJvp05zahdNW7JhpcaoLGXW-Mg/w257-h193/20210219_172428.jpg" width="257" /></a></div>Existing Solutions<br /></h1><h2 style="text-align: left;">SubieLED.com</h2><p>The LED kits from this company seem to be relatively easy to install, and work with the existing dust cover by including an LED with a wide, low-profile heat sink. Another option looks like it would require the dust-cover to be left off. Here's a link to their stuff, in case they get them back in stock, or offer them at a more reasonable price: http://www.subieled.com/#!/Low-Beam-H7/c/48078355</p><h2 style="text-align: left;">CarRover Silicone Dust Cover</h2><p>Using these seemed like it might work with many of the standard H7 bulbs you can get for $30 or $40 from Amazon and various other sources. I even ordered some but when I got them, and thought about it a little more, I realized they wouldn't really close up the headlight housing since the spring clip would be in the way, and if the wire from the LED module/bulb comes out the back, it somehow has to go back into the headlight housing to connect. That further disrupts the dust seal allowing moisture or dust to get in, so they're still not ideal.</p><h2 style="text-align: left;">Others</h2><p>I'm sure there are other LED "bulbs" or dust-cover options that might sorta work for a 2010 Subaru Outback, and there are quite a few that <b>say </b>they'll work, but I really didn't find any that were meant for my specific application. If you're reading this and you know of something, please add a comment.</p><h1 style="text-align: left;">My Solution</h1><p>I have a 3D printer, and reasonably good 3D design skills, so I decided to tackle this with my own "resources." The process was a little annoying since I also decided I was done paying yet-another-$30 for more halogen bulbs, and one of them had already burned out, so I was a bit reluctant to drive after dark. Then the other halogen burned out, so I was stuck not using the Subie until I worked out how to get the LEDs installed.</p><h2 style="text-align: left;">Inverted Dust-Cover</h2><p>I started with the basic idea of an inverted dust cover that leaves the LED heat sink out where air circulates to cool it, and still seals up the headlight housing. However, unlike the "one size fits all" silicone dust cover, mine would need to either account for the spring clip, or replace its function by holding the LED H7 in place. There was also the challenge of routing the wire from the rear of the LED back into the headlight housing to connect with the car's wiring harness.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgazbxgm8aVllf4FEqVhKho9WoCHCOE5Js3D5xff2x7MdsjOXIun2aqVz0YpEG_WS5HaWMpIKRBzyi3EhpKSmhNbaFevq1J0D5HogUtNVcd33OAdfDpE_ekSL4DV_jqQNIF8MU1SBCGjeg/s772/all_for_rendering.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="655" data-original-width="772" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgazbxgm8aVllf4FEqVhKho9WoCHCOE5Js3D5xff2x7MdsjOXIun2aqVz0YpEG_WS5HaWMpIKRBzyi3EhpKSmhNbaFevq1J0D5HogUtNVcd33OAdfDpE_ekSL4DV_jqQNIF8MU1SBCGjeg/s320/all_for_rendering.png" width="320" /></a></div><br /><p></p><h2 style="text-align: left;">Rigid Plastic</h2><p>3D printers can produce flexible objects like silicone, but most of the time they work with rigid materials like PLA or ABS. With strategic use of a few o-rings, I decided the best way to replace the function of the spring-clip was to make the dust-cover fit precisely into the opening and hold the bulb in place. Here's a sketch of what that means for those who understand things better visually than verbally.</p><h2 style="text-align: left;">Pass-Thru for the Wire</h2><p>The final challenge (or so I thought) was passing the wire through from outside back into the headlight housing. You can make any shape you want with a 3D printer, so that was just a matter of printing a slot for the wire, and a plug to cover up the slot after the wire was in. Easy!! Well, ok, it was one of the more tedious parts of creating the 3D model, but still not a complete roadblock.</p><h2 style="text-align: left;">Tight Spaces</h2><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcawo-MfyKw49O3rpFmDSrE2gZPxP8b7M4K8g5ufHVU3PjaJK1J3O9_NOsPh-sTPGAkeB5Bi_Fo3P4tiYYqlmBrgR-eC3WbjPtXN1xxeMBzQ4PQ3b2TafEsCOmwa6183Mn7wTYtjHyym4/s458/alignment_tool.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="458" data-original-width="411" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcawo-MfyKw49O3rpFmDSrE2gZPxP8b7M4K8g5ufHVU3PjaJK1J3O9_NOsPh-sTPGAkeB5Bi_Fo3P4tiYYqlmBrgR-eC3WbjPtXN1xxeMBzQ4PQ3b2TafEsCOmwa6183Mn7wTYtjHyym4/w238-h265/alignment_tool.png" width="238" /></a></div><br />The actual final challenge was that the inverted dust-cover could not be maneuvered into the headlight housing with the LED already installed. The "blade" part of the LED just sticks out too far, and the dust cover has to slide around in front of metal cross-member in the body of the car. The only option is to get the dust-cover in place with the flange part of the LED and <b>then</b> install the LED body. The risk of dropping the LED flange and/or the o-ring into the bottom of the headlight housing was promising to be a show-stopper. I REALLY didn't want to add the chore of fishing those things back out of the housing to the already-frustrating ordeal, But, back to the 3D printer for a solution... all it took was a substitute for the LED body, without anything sticking out, to use during installation. The downside is that this is where the whole solution really locks into a specific LED product (for now).<p></p><h2 style="text-align: left;">More about the Lock-In</h2><p>As I mentioned in the previous section, this solution is not only specific to a 2010 Outback, but also to a specific LED product. It's not that this product is necessarily any better than others, but just happens to be the one I settled on. The main drivers for my choice were, A) fanless design, B) good reviews, C) BeamTech brand generally has good reviews on all products, and D) 30,000 hours lifespan. So, here are the details.</p><p></p><ul style="text-align: left;"><li>BeamTech H7 - BEAMTECH-CCD17-05-S2-H7</li><ul><li>At Amazon: https://smile.amazon.com/dp/B071J4SCXY/ref=cm_sw_r_tw_dp_NCWMMWCDBZEWQ9ER9YHP</li><li>At BeamTechs.com: https://www.beamtechs.com/collections/j1-led-headlight-bulb/products/beamtech-h7-led-headlight-bulb-fanless-csp-y19-chips-8000-lumens-6500k-xenon-white-extremely-bright-conversion-kit</li></ul></ul><div>By the way, the headlight housing is the same on some other Subaru models, like the Legacy sedan, and possibly other year models (maybe through 2014). I'm not 100% sure which ones this might also work on.</div><p></p><h1 style="text-align: left;">Summary</h1><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNP7LA7JvZe-bjuLQJIUV9b-3CkQKSyROasiwQLfsAJw9UlLxdT6PI2-FtRD8A8UcIgefderJmWr14iYexa0ighwJZyuguAjqMsk4wN7cmALRsoKI7UhcUoUjTDlUT6JE1n0T_2zw4_Yg/s410/ready_to_install.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="384" data-original-width="410" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNP7LA7JvZe-bjuLQJIUV9b-3CkQKSyROasiwQLfsAJw9UlLxdT6PI2-FtRD8A8UcIgefderJmWr14iYexa0ighwJZyuguAjqMsk4wN7cmALRsoKI7UhcUoUjTDlUT6JE1n0T_2zw4_Yg/s320/ready_to_install.png" width="320" /></a></div><br />There are a few sub-optimal ways of installing LED headlights in a 2010 Subaru Outback and as a result of the time I spent obsessing over the design and development, there is (now) a more workable, and/or affordable option. Hope this inspires someone else to tackle this project and eliminates some of the guesswork that I had to stumble through.<p></p><p>I know not everyone has a 3D printer, but if you do, and you want to do this project without working all that out for yourself, you can find the model files to print these exact dust-covers and the installation tool for a small fee here: https://cults3d.com/en/3d-model/various/2010-subaru-outback-led-headlight-dust-cover</p><p>I also occasionally have some idle time on my 3D printer, so if it's not an option to print it for yourself, I can print the parts and put together a kit with the o-rings and screws you'll need (but you buy the LED bulbs yourself). Based on previous, similar projects, I'll ask $50 to reimburse materials, printer setup time, trip to UPS, packaging materials, etc. + actual shipping cost (probably around +$10 to most places in the U.S. and +$25 international). Just email me at subaru.ledmod @ liveintellect . org (remove the spaces) to request. I'll let you know how quick I can get it done, arrange for Paypal or something similar, and go from there.</p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-42269027426097953132021-01-23T08:39:00.002-08:002021-01-23T08:39:59.476-08:00Userscript to Automatically Click "Not Now" on the PayPal "Get the App" Nag<p>I finally had enough of the prompt EVERY TIME I LOG IN to PayPal nagging me to get their stupid mobile app. Here's the UserScript (tested in TamperMonkey) to detect when that annoying "Get the App" page pops up right after login, and automatically find the "Not Now" link, and automatically click it. This is what I would do anyway from now on, so the browser might as well do it for me.</p><p><br /></p>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #333333">//</span> <span style="color: #333333">==</span>UserScript<span style="color: #333333">==</span>
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@name</span> SkipPaypalLoginNag
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@namespace</span> http:<span style="color: #333333">//</span>tampermonkey<span style="color: #333333">.</span>net<span style="color: #333333">/</span>
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@version</span> <span style="color: #6600EE; font-weight: bold">0.1</span>
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@description</span> Automatically click the <span style="background-color: #fff0f0">"Not now"</span> link on PayPal<span style="background-color: #fff0f0">'s aggravating "every time you log in" Nag to get their stupid mobile app</span>
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@author</span> Super<span style="color: #333333">-</span>Annoyed PayPal User
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@require</span> http:<span style="color: #333333">//</span>ajax<span style="color: #333333">.</span>googleapis<span style="color: #333333">.</span>com<span style="color: #333333">/</span>ajax<span style="color: #333333">/</span>libs<span style="color: #333333">/</span>jquery<span style="color: #333333">/</span><span style="color: #6600EE; font-weight: bold">1.7</span><span style="color: #333333">.</span><span style="color: #0000DD; font-weight: bold">2</span><span style="color: #333333">/</span>jquery<span style="color: #333333">.</span>min<span style="color: #333333">.</span>js
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@require</span> https:<span style="color: #333333">//</span>gist<span style="color: #333333">.</span>github<span style="color: #333333">.</span>com<span style="color: #333333">/</span>raw<span style="color: #333333">/</span><span style="color: #0000DD; font-weight: bold">2625891</span><span style="color: #333333">/</span>waitForKeyElements<span style="color: #333333">.</span>js
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@match</span> https:<span style="color: #333333">//</span>www<span style="color: #333333">.</span>paypal<span style="color: #333333">.</span>com<span style="color: #333333">/</span>cgp<span style="color: #333333">/</span>app<span style="color: #333333">-</span>download<span style="color: #333333">*</span>
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@grant</span> none
<span style="color: #333333">//</span> <span style="color: #555555; font-weight: bold">@run</span><span style="color: #333333">-</span>at document<span style="color: #333333">-</span>idle
<span style="color: #333333">//</span> <span style="color: #333333">==/</span>UserScript<span style="color: #333333">==</span>
(function() {
<span style="background-color: #fff0f0">'use strict'</span>;
waitForKeyElements (<span style="background-color: #fff0f0">"[data-name='continue_to_the_website']"</span>, clickTheNotNowLink);
function clickTheNotNowLink() {
var skipLink <span style="color: #333333">=</span> document<span style="color: #333333">.</span>querySelector(<span style="background-color: #fff0f0">"[data-name='continue_to_the_website']"</span>);
<span style="color: #008800; font-weight: bold">if</span> (skipLink) {
console<span style="color: #333333">.</span>log(<span style="background-color: #fff0f0">"Found the link to skip this annoying thing"</span>);
skipLink<span style="color: #333333">.</span>click();
} <span style="color: #008800; font-weight: bold">else</span> {
console<span style="color: #333333">.</span>log(<span style="background-color: #fff0f0">"Didn't find the link to skip the annoying thing"</span>);
}
}
})();
</pre></div>
Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-19608254416245135432020-12-19T10:48:00.001-08:002020-12-19T10:48:22.323-08:00Mr. Heater Missing Manual Links<p>Not sure why Mr. Heater chose to more or less hide this content from their customers, but it took me way too much time to find links to the PDF manuals for these Mr. Heater consumer products. There's no obvious place on the Mr. Heater web site with links to these documents, but they're still online and accessible. Eventually I stumbled over the right combination of search words in Google to get a hint at the URL for these documents on the Mr. Heater web site. </p><p>This post is just to help others who simply want to grab an electronic copy of the manual for a product they have, and keep that info on a phone or tablet (or even desktop/laptop computer I guess) instead of carting around the paper copy that comes with the products. I didn't make this content, and am taking no responsibility for it... just linking to it on the Mr. Heater web site. So, I'm sure they'll eventually re-organize things and break these links. The clock starts now 12/19/2020, until that happens. When/if I notice the links are broken, I'll try to find time to update this. Enjoy.</p><h1 style="text-align: left;">Buddy Flex</h1><p></p><ul style="text-align: left;"><li>Buddy Flex Heater - MH11BFLEX - 2020 USA</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/31/</li></ul><li>Buddy Flex Cooker - MH8CFLEX - 2020 USA and Canada</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/32/</li></ul></ul><h1 style="text-align: left;">Portable Buddy</h1><ul style="text-align: left;"><li>Portable ("Little") Buddy Heater - MH8BX - 2020 USA</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/36/</li></ul><li>Portable ("Little") Buddy Heater - MH9BX - 2020 Canada</li><ul><li> https://www.mrheater.com/mwdownloads/download/link/id/37/</li></ul></ul><div><br /></div><div><ul style="text-align: left;"><li>Portable Buddy Radiant Heater - MH4B - 2020 USA</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/33/</li></ul><li>Portable Buddy Radiant Heater - MH4B - 2020 Canada</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/34/</li></ul><li>Portable Buddy Radiant Heater - MH12HB - 2020 USA (Camo)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/38/</li></ul><li>Portable Hunting Buddy Radiant Heater - MH12HB - 2020 Canada (Camo)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/39/</li></ul></ul><h1 style="text-align: left;">Portable Big Buddy</h1></div><div><ul style="text-align: left;"><li>Portable Big Buddy Radiant Heater - MH18B - 2020 USA</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/40/</li></ul><li>Portable Big Buddy Radiant Heater - MH18B - 2020 Canada (Outdoor Only)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/41/</li></ul><li>Portable Big Buddy Radiant Heater - MH18B - 2020 USA (No Fan)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/42/</li></ul><li>Portable Big Buddy Radiant Heater - MH18B - 2020 USA (No Fan / Outdoor Only)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/43/</li></ul></ul><h1 style="text-align: left;">Tank Top Heaters</h1></div><div><ul style="text-align: left;"><li>Gas-Fired Infra-Red Portable Heater - MH15 (1-lb canister version)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/57/</li></ul><li>Gas-Fired Infra-Red Cooker/Portable Heater - MH15C (1-lb canister version)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/58/</li></ul><li>Gas-Fired Infra-Red Tank Top Heater - MH15T, MH30T - 2019 (single and double dish)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/59/</li></ul><li>Gas-Fired Infra-Red Tank Top Heater - MH15T, MH30T - 2020 (single and double dish)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/60/</li></ul><li>Gas-Fired Infra-Red Tank Top Heater - MH45T - 2019 (triple dish)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/61/</li></ul><li>Gas-Fired Infra-Red Tank Top Heater - MH540T - 2020 (mushroom shaped)</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/62/</li></ul></ul></div><h1 style="text-align: left;">Other Stuff </h1><div>(besides the typical portable heater products)</div><div><ul style="text-align: left;"><li>Battery Operated Shower System / BOSS - F235897 - 2017</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/27/</li></ul><li>Battery Operated Shower System / BOSS - XB13, XW18 - 2019</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/28/</li></ul><li>Battery Operated Shower System / BOSS - XCW20 - 2019</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/29/</li></ul><li>Portable Radiant Golf Cart Heater - MH4GC - 2020</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/35/</li></ul><li>Base Camp Angle Iron Stoves - F235825, F235830, F235835 - 2019</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/26/</li></ul><li>Mr. Heater Propane Accessories (catalog) - Hoses Fittings Regulators Accessories -2021</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/1/</li></ul><li>Mr. Heater 2020 Product Catalog - 2020</li><ul><li>https://www.mrheater.com/mwdownloads/download/link/id/4/</li></ul></ul></div><p></p>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-24104581855162769742020-08-05T08:13:00.003-07:002020-08-05T08:13:37.267-07:00Webex Teams Auto-Correct Settings<h2 style="text-align: left;">Summary</h2><div>This is about disabling the annoying auto-correct features in Webex Teams (on a Mac).</div><div><br /></div>Searched for this answer but it does not appear to be in any obvious place in the docs.<div><br /></div><div>The settings are also not accessible in the main "preferences" dialog for the Webex Teams application.</div><div><br /></div><h2 style="text-align: left;">TL/DR</h2><div>Right (or control) click in the text area where you type a message, select the "substitutions" pop-up menu item and toggle things on/off.</div><div><br /></div><h2 style="text-align: left;">More detail...</h2><div>You can toggle on/off</div><div><ul style="text-align: left;"><li>Smart Copy/Paste</li><li>Smart Quotes</li><li>Smart Dashes</li><li>Smart Links</li><li>Data Detectors</li><li>Text Replacement</li></ul><h2 style="text-align: left;">Search/Index Keywords</h2></div><div>auto-correct autocorrect auto correct substitution substitute dash dashes link links replace replacement fix fixing ignore quote quotes hyphen hyphenate hyphens webex teams chat instant message type typing enter entering send sending</div>Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-73407239983610060212020-07-08T14:38:00.003-07:002020-07-08T14:38:49.820-07:00When a Maven Release Build says it "Could not resolve dependencies," but...<h2>
In This Corner - Apache Maven</h2>
I've had this fight with Maven before. I was always in such a hurry when I finally made the change that ended the fight, that I never stopped to analyze exactly why the issue was resolved.<br />
<br />
The whole thing starts when Maven sucker punches me right at the end of the round, when I've got everything working, and it's time to do a release build using the maven-release-plugin. The build works perfectly, UNLESS it is running within the release plugin. WHYYYYYYYYYYYY!?!?!?!<br />
<br />
The error message starts with: "<b>Could not resolve dependencies</b>" but it goes on to say that the actual dependency that it failed to retrieve is a peer module in the same multi-module project. That's when I scream obscenities and threaten to change all my builds back to Ant (which at this point, I'm not sure too many people even remember).<br />
<br />
Wait. Why is it trying to "retrieve" it? It's a peer module, which should be resolved from the reactor. Why is it trying to find it in a remote repository???<br />
<br />
<h2>
Then the hammering begins...</h2>
<ul>
<li>Check that all the groupId tags match each other</li>
<ul>
<li>Yup. Even removed them from child modules so they're inherited. That's not it.</li>
</ul>
<li>Check that all the version tags match up so the release plugin replaces all of them at once.</li>
<ul>
<li>Yup. All good, Even pulled them up into the parent pom's dependencyManagement and used {$project.version} instead of a string that could get messed up. That's not the issue.</li>
</ul>
<li>Clean up all the dependencies that aren't used (copied/pasted from another project)</li>
<ul>
<li>Didn't work. No difference.</li>
</ul>
<li>Change the order of the modules in the parent pom</li>
<ul>
<li>Didn't work. Didn't expect it to. The reactor reorders them for the build anyway.</li>
</ul>
<li>Add the enforcer plugin in the parent project.</li>
<ul>
<li>Didn't find anything wrong. At least this keeps my co-workers from dorking it up though. Will leave that enabled and probably go put it in other projects too.</li>
</ul>
<li>Change the version of plugins to different ones that might have a bug fixed</li>
<ul>
<li>Nope. Same behavior.</li>
</ul>
<li>Compare poms section by section with another project that is building ok.</li>
<ul>
<li>Nothing is jumping out. The look the same. WHAT IS DIFFERENT?!?!?</li>
</ul>
<li>Maybe it's character encoding or whitespace.</li>
<ul>
<li>Well, that was a longshot anyway. Copy/paste in the same IDE/Editor. Check binary character codes. That's all the same.</li>
</ul>
</ul>
<br />
<h2>
Then the futile Googling begins...</h2>
<br />
<ul>
<li>Search "maven reactor multi-module dependencies failure"</li>
<ul>
<li>Find some idiot saying to run <b>mvn install</b>, but I already know to NEVER DO THAT!!</li>
</ul>
<li>Search "maven-release-plugin bug"</li>
<ul>
<li>Nothing matches</li>
</ul>
<li>Search "maven-dependency-plugin bug"</li>
<ul>
<li>It actually might be this, but nothing is reported. Read on and speculate for yourself.</li>
</ul>
<li>Search "maven is stupid and I hate it"</li>
<ul>
<li>Found lots of pointless ranting.</li>
</ul>
</ul>
<br />
<h2>
Clues, Circumstances, Sketchy Evidence, and a Good Guess</h2>
Then I remember that the state of the Maven reactor changes during the different parts of the build lifecycle. That has to be related to why the peer module's artifact is missing in action. But still, why is it ONLY happening during a release build?<br />
<br />
Then I see something in the pom for the module that is failing that might explain it.<br />
<div style="margin: 1em auto 0 auto;">
<pre> <plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-dependency-plugin</artifactid>
<version>3.1.1</version>
<executions>
<execution>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin>
</pre>
</div>
<br />
<br />
So, ok... that is related to a hack for a code generation plugin so that it forces Maven to resolve a properties value like this:<br />
<div style="margin: 1em auto 0 auto;">
<pre><properties>
<swaggerRef>${com.example.services.myservice:common-abbreviations-service:json:webapp}</swaggerRef>
</properties>
</pre>
</div>
<br />
...early enough in the build for the code generation plugin to use it.
<br />
<br />
So, that explains why the dependency plugin is busy doing stuff BEFORE the reactor has everything ready to resolve locally.<br />
<br />
But, it still DOESN'T explain why it only happens in a release build.<br />
<br />
Stay tuned. One day I'll figure out that part too.<br />
<br />
<h2>
(TL/DR) Solved</h2>
For now...<br />
If you're having this kind of issue in a build, look around for something that is forcing the normal Maven lifecycle to execute in an unusual order. The way I resolved this one was to refactor things a bit and make the hacky code-gen module a "leaf" in the module tree. If there are no peer-module dependencies, it doesn't matter, even in a release-build, if the dependency plugin runs too early.<br />
<br />Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-2085162080883162172019-09-21T10:32:00.001-07:002019-09-21T10:32:18.566-07:00Amazon Save For Later Changed My Shoe SizeI recently added a pair of boots to my Amazon cart, size 11, but I wasn't quite ready to buy. Then my daughter asked me to order a clothes drying rack, so I had to click "Save for later" on the boots to move them temporarily out of the cart. A few days later, I had read enough reviews on the boots, and decided it was time to place the order. I found the boots in the "Saved for later" section of my Amazon cart, and clicked "Move to Cart" (no idea why "Cart" is capitalized but "later" is not, but semantic inconsistencies were not related to the issue anyway).<br />
<br />
I placed the order, assuming that if I selected size 11 when I added the boots to the cart, the item I was ordering would still be size 11 after "Saving for later" and "Moving to Cart." A few days later, I received a pair of size 10 boots. My first thought was, "bummer, how could I have messed that up?" The more I thought about it, the more I convinced I became that it wasn't my mistake at all. I haven't been able to cram my size 10.5-11 foot into a size 10 shoe since it was still actually a size 10, which was maybe my sophomore year of high-school (i.e. a REALLY long time ago). I would never, ever select a size 10 shoe, under any circumstances.<br />
<br />
So, out of curiosity, I started looking for the reason I ended up with size 10 boots, and another chore on my list to return/exchange the boots with Amazon. I opened a new browser window, where I wasn't even logged into Amazon, and navigated to the product page for the boots. The screen starts with a drop down box pre-set to "Select" which forces a choice from the other options (7, 8, 9, 10, 11, etc.). If I chose anything from that list, it would have been 11, not 10. So, maybe I mistakenly clicked the wrong option. Maybe I'm also blind and couldn't see what I had clicked. Maybe I also didn't notice the incorrect size after clicking "Add to Cart" (which becomes part of the item title). By the way, now I'm starting to think Amazon's interpretation of the word "Cart" characterizes it as a formal noun. Perhaps the website designer has a friend who is also named "Cart."<br />
<br />
I really wish there were a way to tell Amazon they have a bug in their website, but the reality is, they could not care any less, unless it is a security vulnerability. So, how do I know it's a bug? I have this (maybe bad) habit of leaving dozens, perhaps sometimes hundreds, of browser tabs open. I get interrupted by family members, random thoughts, reminders on my phone, barking dogs, overheard nearby conversations, and probably all sorts of other things. So I open a new tab, leaving the current one open, whenever I decide the interruption requires some info I might find on the web. I happen to have left the tab open on my Amazon.com cart, from when I first added those boots (before "Saving for later" or "Moving to Cart"). The size, 11, was clearly shown at the end of the cart-item's title. Now I'm reasonably sure I did what I thought I would have done... picked my own correct shoe size.<br />
<br />
If you spent the time to read this, I hope you get the time back someday soon when/if something you added to your Amazon cart... sorry "Cart"..., then moved to "Saved for later" and then moved back to your cart, gets resized, color-changed, or some other selection shifts without notice. If you're paying just a bit closer attention, and get things corrected before placing the order, maybe it'll save you the hassle of shipping something back. At the very least, maybe this confirms that you might not have made a mistake, or you might not actually be losing your memory (yet).<br />
<br />
I haven't been able to get Amazon's "Cart" + "Save for later" feature to fail in the same way again, and I don't intend to spend any more time on it. If you notice this happening, and have a set of steps to make it happen, leave a comment. I'd like to know if anyone else has tripped over this annoying little quirk.Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-9274029711115402732019-06-30T20:21:00.002-07:002019-06-30T20:33:45.898-07:00PZEM-051 DC Digital Multi-Function Meter - Instruction ManualThe instructions for this device are not only hard to find online, but even if you do find them, they're not very clear. This blog post is meant as an attempt to remedy both issues.<br />
<br />
Note: To find and download the original instructions, it may be useful to search for PZME_051.pdf (instead of PZEM-051).<br />
<br />
<h2>
Features</h2>
The PZEM-051 has the following functions.<br />
<br />
<ul>
<li>Default "Always On" Display includes these 4 values</li>
<ul>
<li><b>Source Voltage</b> - used to determine the charge level of a battery</li>
<li><b>Amperage Draw</b> - used to determine the rate at which power is being drawn</li>
<li>"<b>Power</b>" - wattage being drawn </li>
<ul>
<li>Note: This could be calculated from Amps * Volts, but this saves doing the math in your head</li>
</ul>
<li>"<b>Energy</b>" - watt-hours drawn since reset - used to determine how much a battery has been discharged (compare with the amp-hours of the battery</li>
<ul>
<li>displayed in Wh until 10000 Wh is reached</li>
<li>displayed in kWh above 10000 Wh</li>
<li>counter value is kept in memory and persists across power cycles until explicitly reset/cleared (i.e. When the PZEM-051 is disconnected and then reconnected to voltage, the accumulated value of "energy" will continue where it left off.)</li>
</ul>
</ul>
<li>Backlight</li>
<ul>
<li>can be toggled on or off</li>
<li>The backlight state is kept in memory and persists across power-cycles (i.e. When the PZEM-051 is disconnected and then reconnected to voltage, the backlight will return to the same state it was in previously.)</li>
</ul>
</ul>
<br />
<ul>
<li>High and Low Voltage Alarms - </li>
<ul>
<li>flashes the display/backlight</li>
<ul>
<li>Note: This is <b>not</b> an audible alarm</li>
<li>can be customized to match the source battery.</li>
</ul>
<li>will flash the backlight when the actual voltage is not within range</li>
</ul>
</ul>
<br />
<h2>
Button Functions</h2>
<div>
<ul>
<li>Backlight Toggle</li>
<ul>
<li>Each short click turns the backlight on or off</li>
</ul>
<li>Voltage Alarm Settings</li>
<ul>
<li>Click and hold until <b>SEt</b> appears in the display</li>
<ul>
<li>Each digit of the high and low voltage values will blink in turn</li>
<li>If the value of a digit is not changed for 3 seconds, the blinking digit will automatically switch to the next digit in sequence</li>
</ul>
<li>Each short click in this mode will increase the value of the blinking digit, wrapping from 9 back to 0 (zero)</li>
<li>Each alarm threshhold may be set to a value from 6.5V up to 99.90V</li>
<li>Values less than 10.0 must have the first digit set to zero (e.g. 09.5)</li>
<li><b>Important: The high voltage alarm threshold is on the left side, and the low voltage alarm threshold is on the right side</b> (reversed from low-to-high, left-to-right)</li>
<li>To store the new settings, click and hold again until PASS appears briefly on the display</li>
<ul>
<li>Note: If the high and low alarm thresholds are set backwards, the display will show "Err uAL" briefly, and the new values will be rejected (i.e. the previous values will be retained).</li>
</ul>
</ul>
<li>Clear/Reset the counter/accumulated-value for Energy (watt-hours)</li>
<ul>
<li>Click and hold until <b>CLr</b> appears in the display, and the "Energy" counter value begins blinking.</li>
<ul>
<li><b>Note: SEt will appear first - continue holding until CLr appears</b></li>
</ul>
<li>A short click while in this mode will reset the "Energy" value to 0Wh (zero watt-hours)</li>
</ul>
<li>Adjust the type of Current Shunt</li>
<ul>
<li>Click and hold until Curr appears in the display</li>
<ul>
<li><b>Note: SEt will appear first, then CLr - continue holding until Curr appears</b></li>
</ul>
<li>Note: This should be preset to the type of shunt that was bundled with the PZEM-051, but can be switched to one of two types. </li>
<li>Each short click in this mode will toggle between</li>
<ul>
<li><b>100A</b> - for the 100A/75mV shunt</li>
<li><b>50A</b> - for the 50A/75mV shunt</li>
</ul>
</ul>
</ul>
</div>
Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com8tag:blogger.com,1999:blog-3279772827714743698.post-47359840141425998842018-10-15T07:37:00.001-07:002018-10-15T07:37:27.711-07:00Anyone else think the Stash/Bitbucket ASCII-Art looks like Ultraman?<div class="separator" style="clear: both; text-align: left;">
Ultraman from the <a href="https://www.imdb.com/title/tt0068145" target="_blank">1972 TV series</a>...</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKUicOAjN-k6CLCmPON6sTfrSHzsxy9m9tH9yq-TryU2VZkVI3LmMme1BM7hZA4w5Xt8O29q6mCFSatjQh6fIp1OnuzW2_7fOllPCj7g6h09oG49bUF3DiIiJeZen2JMEVi5Yu3UbEzRc/s1600/ultraman.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="390" data-original-width="347" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKUicOAjN-k6CLCmPON6sTfrSHzsxy9m9tH9yq-TryU2VZkVI3LmMme1BM7hZA4w5Xt8O29q6mCFSatjQh6fIp1OnuzW2_7fOllPCj7g6h09oG49bUF3DiIiJeZen2JMEVi5Yu3UbEzRc/s320/ultraman.jpg" width="284" /></a></div>
<br />
Atlassian Stash/Bitbucket guy...<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS7apWHKHtQHBbyGsF1YD2QzxMrQ-pwFNyfHla-4YjkvR37qz1lyMP5gu7ataeucuHJF24quw6fHUKIWYLl5aAi9KtmKk4vb8vR4XIawYz1-zFfMvtBTiG-bIsReyG7HG7RkyjhWMP-4I/s1600/Screen+Shot+2018-10-15+at+8.24.21+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="770" data-original-width="602" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS7apWHKHtQHBbyGsF1YD2QzxMrQ-pwFNyfHla-4YjkvR37qz1lyMP5gu7ataeucuHJF24quw6fHUKIWYLl5aAi9KtmKk4vb8vR4XIawYz1-zFfMvtBTiG-bIsReyG7HG7RkyjhWMP-4I/s320/Screen+Shot+2018-10-15+at+8.24.21+AM.png" width="250" /></a></div>
<br />
...or maybe I'm the only one who sees it.Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-29050368591165448282018-05-22T20:53:00.002-07:002018-05-22T21:01:01.368-07:00Samsung GS5 Android system_serverAfter several years, my Samsung GS5 suddenly started running the battery dead in a few hours. Just days before, the battery was lasting all day before it needed a re-charge. Coincidentally, I had just purchased a new phone that was on the way from T-Mobile with a new, unactivated sim-card. I have no way to prove that anything was pushed to the GS5 to make it start acting badly, but the timing was extremely suspect.<br />
<br />
So, I still had plenty to do on the old phone to transfer on-phone data to the new device, so I still needed it to be working. I was wondering what was causing the excessive battery drain, so I opened up the "#top" app to see if there was a process sucking up lots of CPU time. This is where I noticed that a process named "system_server" was constantly running at 30%+ CPU. Searching for answers about what "system_server" does was a fruitless pursuit. There was some noise about turning off bluetooth, or making a call to voicemail to reset something, but all of the internet voodoo related to the system_server high cpu issues changed nothing.<br />
<br />
A few days later, I started the process of clearing off apps from the old phone one-by-one, in hopes that one of them would reveal itself as the guilty party. Nothing seemed to relieve whatever was going on within system_server though. Then I uninstalled some app I had installed ages ago, and I couldn't even say which one it was because the next thing that happened was SOOOOOO infuriating and distracting. The phone suddenly started displaying the following message, over and over and over. <b>"Unfortunately the process android.process.acore has stopped."</b> I would tap the OK button and the message would pop right back up. I had about enough time between each pop-up to tap one other thing. Restarting the phone didn't make that go away either.<br />
<br />
More internet searching gave me a suggestion to open the settings, switch to the "Applications Manager", find the "Contacts Storage" app (which only appeared in the "all" applications, and the "all" category wasn't even on the screen at first, but I digress...). I then cleared the cache for the "Contacts Storage" app, but that didn't make the messages stop. I then tapped the "Turn off" and "Force stop" buttons and the message finally stopped popping up. Just to be sure it wasn't a coincidence, I tapped "Turn on" and the messages started popping up again immediately. So I turned it off and force-stopped it again to end the insanity until I could find the real cause.<br />
<br />
The interesting thing about all this is that after I stopped the "Contacts Storage" app, the original issue with the system_server process burning up the CPU was gone. system_server was now running at only about 1% CPU and the battery was back to its normal discharge rate.<br />
<br />
There was so little information to be found that would have linked these issues together, I decided to write this in case it helps connect the dots for someone else who is dealing with this torment. Hope it helps.<br />
<br />
This helped me: https://www.quora.com/How-do-I-fix-the-process-android-process-acore-has-stopped-errorWhirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0tag:blogger.com,1999:blog-3279772827714743698.post-69711893867719464452018-03-05T09:49:00.000-08:002018-03-05T09:49:43.516-08:00Do You Trust Amazon Reviews?More specifically, do you trust overly positive product reviews on Amazon.com?<br />
<br />
I recently purchased a lamp on Amazon. My confidence to trust that it was a well made, reliable product came primarily from the MANY 5-star reviews.<br />
<br />
Then, when I received the lamp, the product-box (not the Amazon box) included the following bribe for a 5-star review.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcxb3eExlTSP2gOHVpmSVH0R-r8OSUKSQ0rBqUBdlZ5bGl4vM0SUjTZdt03hWAFb_2g5HaUJDUvhHXCvPqeCDDnLNZIsiDKKSE3UHAHLMiBFH0m040SoKWVHdJdgE3MMQ8KwE8yeUCOTk/s1600/bought_review_back.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1189" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcxb3eExlTSP2gOHVpmSVH0R-r8OSUKSQ0rBqUBdlZ5bGl4vM0SUjTZdt03hWAFb_2g5HaUJDUvhHXCvPqeCDDnLNZIsiDKKSE3UHAHLMiBFH0m040SoKWVHdJdgE3MMQ8KwE8yeUCOTk/s320/bought_review_back.jpg" width="237" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioFASRFu0Hahnye5kFDjbdr1LKeP5rKnVMsQM_kVaxt6RjXHxEaBYoGF66R7ZMAvpln8CV2KgGkQEWc7jajNzHAcvZ1kPOgsWfkM-mWglH-8xbHflxcGkWdvqNGJvEF7C9VPqNsUbuE04/s1600/bought_review_front.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1193" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioFASRFu0Hahnye5kFDjbdr1LKeP5rKnVMsQM_kVaxt6RjXHxEaBYoGF66R7ZMAvpln8CV2KgGkQEWc7jajNzHAcvZ1kPOgsWfkM-mWglH-8xbHflxcGkWdvqNGJvEF7C9VPqNsUbuE04/s320/bought_review_front.jpg" width="238" /></a></div>
<br />
My first thought was, hey, free money to spend on more stuff at Amazon...<br />
<br />
My second thought was, hey, this pretty much means the reviews on this product were bought for about half of what the product costs.<br />
<br />
My third thought was, hey, if they can cover that and still make money, the margin on this thing has to be around 75%. Hope it's not complete junk.<br />
<br />
Bottom line is that I now have yet one more reason to suspect the genuineness of Amazon reviews. Negative reviews are probably still useful for finding out if a product's flaws are acceptable (because there's lots of whining going on in reviews too), but if a product has overwhelmingly positive reviews, that may not mean very much.<br />
<br />Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com1tag:blogger.com,1999:blog-3279772827714743698.post-61048040337560193172018-01-30T22:57:00.002-08:002022-03-28T13:25:58.694-07:00Benjamin Airbow - Missing AccessoryLast spring, I got one of the most fascinating "toys" (which is not really a toy at all, but I still can't think of a better word.) I'm talking about the Benjamin (Crosman) Pioneer Airbow. If you found this post by an internet search, you probably already know what the Airbow is, and what it does, and I don't really have anything to add to the product info on the Crosman web site. https://www.crosman.com/airbow<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFEw7fFWEi9LbfRmcyhE5MZQgI-P8Ajsy8rHaRY3Ic-7Xk3sraWoEvU_dIN3HWoO5E0SUsIs2K9VprETPwSzK3M_9HBtymxsIyYGDrxjj3ArTMJlDCXX06aD6rxzMQ19ILnCeMfMSbA8k/s1600/DSC04792.JPG" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1067" data-original-width="1600" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFEw7fFWEi9LbfRmcyhE5MZQgI-P8Ajsy8rHaRY3Ic-7Xk3sraWoEvU_dIN3HWoO5E0SUsIs2K9VprETPwSzK3M_9HBtymxsIyYGDrxjj3ArTMJlDCXX06aD6rxzMQ19ILnCeMfMSbA8k/s320/DSC04792.JPG" width="320" /></a>One of the very first things I noticed when I unboxed my Airbow was that the arrow tube is "floated" and sticks out in the front about 4.5" with nothing to protect it from getting bent, dented, scratched, covered in dirt, or any number of other things that would make the Airbow perform poorly or not at all. Another thing that doesn't seem ideal, is that Benjamin put the air gauge right up on the front of the Airbow. Besides the fact that you have to aim the Airbow at or near your face to _see_ the pressure reading, the gauge's bezel is only slightly protected on the lower side, but otherwise exposed to anything the front of the Airbow might hit.<br />
<br />
At first I didn't worry too much about it, but one of the first few times I tossed the Airbow into the back of my car to take it over to the local archery range, on the way over, someone pulled out in front of me, and I had to stomp the brakes to keep from hitting them. The Airbow was in the Benjamin soft case (shown in the pictures) but the whole thing went sliding and stopped against the back of my seat. Luckily it was oriented such that the stock end hit the seat, but if it had been the other way, I'm almost sure the arrow tube, the gauge, or both would have been damaged.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWe7jkHutvN-9-dLi2thvEdR8UB0VlqnNrLPoPvLXqb6-hsMegA61sgnt38s0BL9z5RZNXgvTDNy6htWFIG2iZW2xihIFyJQU6Ju8a2-96jU84UOxNh_A-etdOmdzm-tva99FuBA9USB8/s1600/DSC04793.JPG" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1067" data-original-width="1600" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWe7jkHutvN-9-dLi2thvEdR8UB0VlqnNrLPoPvLXqb6-hsMegA61sgnt38s0BL9z5RZNXgvTDNy6htWFIG2iZW2xihIFyJQU6Ju8a2-96jU84UOxNh_A-etdOmdzm-tva99FuBA9USB8/s320/DSC04793.JPG" width="320" /></a>That's when I decided to put my CAD skills and my 3D printer to work and make something to guard the front of the Airbow without having to buy an expensive and bulky hard case for it. After I made it, I started thinking that it would also be much better protection for the sensitive, exposed parts of the Airbow while it was being hoisted up into a tree-stand or just carried through brush to a hunting spot. Transporting a bow or rifle into the field in one of those bulky, heavy hard-cases is not my idea of fun.<br />
<br />
<i>By the way, hunting with the Airbow isn't really an option where I live because the Airbow isn't approved for hunting any kind of game in my state, but I'm still hoping that will change. Or, I may travel to a neighboring state where they have approved the Airbow for hunting.</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMkLynxyT1q4sDuYavvYk0VmRXoLHV1Cb9QjN6DIF05BVCFjaq6jNQrMV26e3NVjo4zf1fGfgxyiocenYY4lAnAQHc23dbXcPvxBshbOIxY6aiviTPNvCzC8vXiu2Ma8p7T2EL3A4rfwE/s1600/DSC04794.JPG" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1067" data-original-width="1600" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMkLynxyT1q4sDuYavvYk0VmRXoLHV1Cb9QjN6DIF05BVCFjaq6jNQrMV26e3NVjo4zf1fGfgxyiocenYY4lAnAQHc23dbXcPvxBshbOIxY6aiviTPNvCzC8vXiu2Ma8p7T2EL3A4rfwE/s320/DSC04794.JPG" width="320" /></a></div>
Most of the time, I wouldn't even share an idea like this, because I would assume I'm the only one who thinks the problem really needed solving. However, I suspected that I might not be the only one who had these concerns about the Airbow, so I posted a short video clip on YouTube to show what I had done to "fix" it. As it turns out, several people who have Airbows, and have found my video, actually did have the same worries about the arrow tube and the air-pressure gauge.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqPGLMkJIVzBQumEeUnGosWbhelYyCnJOBPoamJX7bgiBe5g8pIh8j2dh1nPEMYkEbj4wzPBp2KvA9ZPBfihtBYXUsXZmrdXmUT8SXvFhOm64lDfUOuQycYaN653hkgnk7O9PH8xhb3cg/s1600/DSC04789.JPG" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1067" data-original-width="1600" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqPGLMkJIVzBQumEeUnGosWbhelYyCnJOBPoamJX7bgiBe5g8pIh8j2dh1nPEMYkEbj4wzPBp2KvA9ZPBfihtBYXUsXZmrdXmUT8SXvFhOm64lDfUOuQycYaN653hkgnk7O9PH8xhb3cg/s320/DSC04789.JPG" width="320" /></a></div>
Some of those people have requested that I make an Airbow Guard/Cover for them. So, I did some digging to find out how much it costs, for comparison purposes, to have a 3D printing service make the parts. I checked on https://www.treatstock.com/ and found several companies that, based on reviews, probably have some level of competence. Many of them charged close to $80, which I thought was a little too much. Shipping one of these things within the contiguous U.S., via UPS, is around $15. With that as a basis, and considering the time and material costs, I decided that it would be worthwhile to make one for $50, so with shipping (to the "lower 48") that would total of around $65 (unless you're in a UPS "Extended Area" which costs a little more, so maybe up to $70 total). I could also ship one elsewhere (Europe, Australia) if the requester was ok paying about $25 for shipping (USPS First Class Package) and whatever the currency exchange fee is (approx $5) - total of around $80.<br />
<br />
I can tell there's some interest based on the YouTube video, so I'm posting this "blog" as another way Airbow owners might be able to learn about the Airbow cover I made. I also wanted to tell a little more of the story behind it (hope I didn't rattle on too long). I'm not really set up to mass produce these things, but I can make one or two a week. If you are interested in having one of these, just send me a message at <b>airbowcover @ liveintellect . org</b> (remove the spaces) and we can work out the details.<br />
<br />
Here's the YouTube video, if you're interested...<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/rn-Nx769eG4/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/rn-Nx769eG4?feature=player_embedded" width="320"></iframe></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><b>ALERT</b>: This is <b>NOT</b> meant to remain in place while shooting. It is only meant to protect the arrow tube and gauge while the Airbow is in storage or while it is being transported. It must be removed before loading and firing an arrow.</div>
Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com4tag:blogger.com,1999:blog-3279772827714743698.post-78479482393330182072017-12-16T21:05:00.003-08:002017-12-16T21:07:39.899-08:00Chromecast Audio Stopped WorkingDon't know why the audio on my Chromecast suddenly stopped working, but no resetting or restarting or replugging anything made any difference. The volume wasn't set all the way down on the Chromecast, or the TV, or the app (which was YouTube, but I'm not sure that matters), and nothing was set to mute.<br />
<br />
The thing that _did_ make a difference was changing a setting you can only get to via the Google Home app, so here are the details. <br />
<ol>
<li>Open the "Google Home" app.</li>
<li>Select "devices" from the main menu.</li>
<li>Select "settings" from the popup menu for the "silent" Chromecast device.</li>
<li>Flip on the switch in the "Display" section labeled "Use 50Hz HDMI Mode"</li>
</ol>
I didn't bother to go find out why, but that got the sound working again.<br />
<br />
BTW, the TV to which the Chromecast is connected is a little older but not so old that the default settings on Chromecast should prevent something as basic as _sound_!!! Thanks a lot Google!!<br />
<br />
Anyway, with all the useless forum post chatter out there suggesting "turning it off and on again", "The IT Crowd" style, I thought it might be useful to post an answer that actually did work. <br />
<br />
<br />Whirlyhttp://www.blogger.com/profile/03366936532800376833noreply@blogger.com0