Category: Uncategorized

Do not buy a Renewed Google Pixel Verizon variant

Do not buy a Renewed Google Pixel Verizon variant

The Google Pixel Verizon variants are absolute garbage. The reason why is Verizon purposefully encrypts the bootloader to where you can’t unlock it. When you tell Verizon about unlocking the bootloader, they think you mean carrier unlocking the phone to use on other carriers and while the Google Pixel 6 that I just received from Amazon. Here is a breakdown of phone models for Pixel that have locked bootloaders.

Google Pixel 6 – GA02300-US
Google Pixel 6a – GA03327-US
Google Pixel 8 – GA04880-US
Google Pixel 8 Pro – GA04838-US
Google Pixel 7a – GA04264-US
Google Pixel Fold – GA03810-US
Google Pixel 7 – GA04260-US
Google Pixel 6 – GA03300-US
Google Pixel 6 Pro – GA02231-US

PC Keyboards for Smokers

PC Keyboards for Smokers

If you’re like me that smoke at your computer, you know about going through keyboards like socks or worse. So, I’m going to give a list with Amazon links of keyboards I’ve tried personally and if they are good (or bad) for smokers.

Amazon Basic Keyboard: Absolutely the worst on this list. Keys are recessed, ashes can get into these crevasses and you have to take it apart to do cleaning, however, after cleaning, it works pretty well. add some lube around every key for better keystrokes.

ChonChow Model 1910b: Very cheap feeling keyboard, Says “Mechanical Feel” but not mechanical at all. Keys are easily cleanable, the keyboard is still working after 3 years and I’ve never cleaned it. I blow the ashes out and back in business. You probably need to lube the keys as they are getting harder to push down after all these years but not bad for a cheap keyboard brand.

CyborHSoldier Airfox GMK-II: I like this keyboard. If I hadn’t spilled coffee on it 3-4 times, it would still be going. It still works but there are some problem keys that I may tackle a switch repair on at a later date.

Please in the comments, if you are a smoker, share your thoughts on keyboards you’ve personally owned.

Scraping Election data with Scrapy

Scraping Election data with Scrapy

For our office election watch party last night, we wanted to watch results on as many simultaneous races as we could but we were particularly interested in the locals.

That’s because we knew the national races would be covered heavily and we had a projector set up for TV coverage, but the local races would be  more difficult to follow without a lot of channel flipping.  At the same time, we also knew we weren’t going to come up with some sort of hologram-Wolf-Blitzer-projected-on-a-touch-screen-ice-rink level visualization in just a couple of hours.  We could build something fun, responsive, and autonomous though.

To get it done quickly I’d need to channel my past in the newspaper industry and remember that doing it “right” wasn’t worth much of anything if it wouldn’t be done until it was two days too late.

The game plan was as follows:

  • Scrape local/state election data from the internet, on an interval
  • Load election data into a prebuilt dashboarding tool, on an interval

Identify Sources

I was interested in two sets of races:  The Arkansas state referendum, and the major City of Fayetteville races (4 city council alderman races and one mayoral race).

I reached out to a contact at the local newspaper to ask if they’d have live data coming in across the AP wire or elsewhere.  It turned out an election results webpage was already live for me to start inspecting.  Score.  I checked out the local races page and found the markup looked like this:

<div class="elections-race card card-block">
  <h4 class="card-title">ALDERMAN </h4>
  <h4 class="card-title">WARD 1, POSITION 2  </h4>
  <span class="elections-county-reporting"></span>
  <div class="elections-candidates clearfix" id="race-9053">
    <div class="candidate-tr clearfix candidate">
      <div class="col-xs-4 col-lg-3 candidate-td candidate-name">
        <span> <span>*</span>                                                                      Sarah Marsh
        </span>
      </div>
      <div class="col-xs-4 col-lg-2 candidate-td candidate-vote-count">
        0
      </div>
      <div class="col-xs-4 col-lg-1 candidate-td vandidate-vote-percent">
        0<span>%</span>
      </div>
      <div class="col-xs-12 col-lg-6 candidate-td candidate-progress">
        <progress class="progress progress-striped progress-success" value="0" max="0">
          <div class="progress progress-success">
            <span class="progress-bar" style="width: 0%;"></span>
          </div>
        </progress>
      </div>
    </div>
    <div class="candidate-tr clearfix candidate">
      <div class="col-xs-4 col-lg-3 candidate-td candidate-name">
        <span>                                                                    Paul Phaneuf
        </span>
      </div>
      <div class="col-xs-4 col-lg-2 candidate-td candidate-vote-count">
        0
      </div>
      <div class="col-xs-4 col-lg-1 candidate-td vandidate-vote-percent">
        0<span>%</span>
      </div>
      <div class="col-xs-12 col-lg-6 candidate-td candidate-progress">
        <progress class="progress progress-striped" value="0" max="0">
          <div class="progress">
            <span class="progress-bar" style="width: 0%;"></span>
          </div>
        </progress>
      </div>
    </div>
    <span class="elections-meta-time">
    </span>
  </div>
</div>
Not bad. Bootstrap definitely gives us a lot of CSS selectors to work with. There's a lot of whitespace around the candidate names, but that can be dealt with. The race title, at least in some cases, is split between two 

1
&lt;h4 class="card-title"&gt;
 tags which will also need to be reconciled.
Not shown in this markup is the way individual counties and cities are labeled in this data, but they were 

1
h3
 and 
1
h4
 tags, respectively, that were siblings to these 
1
&lt;div class="elections-race"&gt;
 divs. That would be harder to sort out--we'd have to walk back through the nearest preceding sibling elements to find the relevant municipality.

I then turned my attention to the state ballot issues page and found a lot of this:

<script language="JavaScript" src="http://hosted.ap.org/elections/2016/general/by_race/AR_6486.js?SITE=ARLIDELN&amp;SECTION=POLITICS"></script>

After having a newspaper flashback (these hosted Associated Press scripts are full of 

1
document.write()
) I decided I didn’t want to deal with parsing or rendering javascript, so I looked elsewhere for the state data which should be easier to find–and it was.

Politico had the state referendums, and they looked like this:

<div class="results-detail" data-racenum="6485" data-stateabb="AR">
  <div class="macro">
    <div class="results-about">
      <h6>Amend Term Limits and Rules</h6>
      <p class="summary">Concerns term limits for members of the Arkansas General Assembly. </p>
      <p class="reporting">0% Reporting</p>
      <p class="share"><a href="https://twitter.com/intent/tweet?text=%23AR amend term limits and rules ballot measure passes%3B 0%25 reporting.&amp;url=http://politi.co/2epgNZ5&amp;hashtags=election2016" class="twitter" target="_blank"><b aria-hidden="true" class="icon icon-twitter"></b></a></p>
    </div>
  </div>
  <div class="micro">
    <table class="results-table">
      <tbody>
        <tr class="type-ballot">
          <th scope="row" class="results-name"><span class="name-combo"><span class="token token-winner"><b aria-hidden="true" class="icon icon-check"></b><span class="icon-text">Winner</span></span> For</span></th>
          <td class="results-percentage"><span class="percentage-combo"><span class="number">0%</span><span class="graph"><span class="bar"><span class="index" style="width:0%;"></span></span></span></span></td>
          <td class="results-popular">0</td>
        </tr>
        <tr class="type-ballot">
          <th scope="row" class="results-name"><span class="name-combo"> Against</span></th>
          <td class="results-percentage"><span class="percentage-combo"><span class="number">0%</span><span class="graph"><span class="bar"><span class="index" style="width:0;"></span></span></span></span></td>
          <td class="results-popular">0</td>
        </tr>
      </tbody>
    </table>
  </div>
</div>

This markup was a bit more structured, so there wouldn’t be much trouble ingesting it.

Enter Scrapy

Scrapy is a handy Python framework for building web crawlers and parsing HTML content. 

Now, Scrapy was probably overkill for what we needed since we were just parsing a couple of single page targets.  As a framework, Scrapy is geared towards building spiders:  bots that crawl webpages across links and build very robust pipelines of data.   That said, it’s a breeze to install and comes with enough syntactic bells and whistles that it was worth using, even if we only used about 1% what it is capable of.

mkvirtualenv elx_scrape
pip install scrapy
scrape startproject elx .

This starts a script project in the current directory called “elx”.    

I didn’t end up doing much more with scrapy than is outlined in the tutorial section of their documentation, which is nicely detailed.  I jumped in and created two crawlers, one for each data source:

#elx/spiders/base.py

class LocalSpider(scrapy.Spider):
    name = 'local'
    start_urls = [
        'http://elections.wehco.com/elections/general2016/contested/vote/results',
    ]

    def parse(self, response):
        return []

class StateSpider(scrapy.Spider):
    name = 'state'
    start_urls = [
        'http://www.politico.com/2016-election/results/map/ballot-measures/arkansas/',
    ]

    def parse(self, response):
        return []

These of course don’t do anything but return an empty list, but each one pulls down the appropriate page and is ready for parsing.

The next step was to write the CSS/XPath selectors that would locate the data I sought.  Possibly the coolest tool in the scrapy toolbox is its interactive shell that lets you quickly play around with a scraped page’s data to design your parse methods:

scrapy demo

After a lot of fiddling I ended up with parse functions for each crawler that looked something like this:

    def parse(self, response):
        for race in response.css('.elections-race'):
            candidates = race.css('.candidate-tr')

            try:
                municipality = race.xpath('./preceding-sibling::h5/text()').extract()[-1]
            except IndexError:
                municipality = ""

            yield {
                'race_title': " ".join(race.css('.card-title::text').extract()),
                'municipality': municipality,
                'candidates':  ["".join(c.css('.candidate-name > span::text').extract()).strip() for c in candidates],
                'votes': [float("".join(c.css('.candidate-vote-count::text').extract()).strip().replace(',', '')) for c in candidates],
            }

Which allowed me to run 

1
scrapy crawl local -o results.json
 and get something like this:

[
  {
    "municipality": "Dewitt",
    "race_title": "ALDERMAN  WARD 1, POSITION 1  ",
    "candidates": [
      "Ada Clark",
      "Brent London"
    ],
    "votes": [
      460,
      407
    ]
  },
//...
]

Creating a Rube Goldberg Device

We decided on Geckoboard as the best option for quickly visualizing our data.  It could pull sources over the web, we already had an account there, and it looks pretty decent.

We immediately found some problems in our data formatting though.  The prebuilt widgets we thought would work best required:

  • CSV data
  • One CSV file per chart

That didn’t quite fit what we had scraped, but we did what any programmer with minutes left on a deadline would do.  We hacked and repeated a bunch of code!

Each Spider above was turned into a Pythonic base class with some sort of filtering in the 

1
parse
 method (only yield results if the race matches a certain title, etc) and created individual spiders for each race.

Luckily, switching scrapy’s output to CSV was painless–it can be done through a project setting, or by simply specifying a 

1
.csv
 extension in your output file.

That machinery got wrapped by a shamefully barbaric shell script which refreshed our data every five minutes:

while true;
do
rm output/alderman1.csv
scrapy crawl alderman1 -o output/alderman1.csv
rm output/alderman2.csv
scrapy crawl alderman2 -o output/alderman2.csv
rm output/alderman3.csv
scrapy crawl alderman3 -o output/alderman3.csv

# ...

sleep 300;
done;

Now we had data being pulled to my laptop every 5 minutes–we just needed to get it web accessible for GeckoBoard to ingest it.

ngrok and SimpleHTTPServer

Ngrok is a neat tool that sets up a dynamic proxy to a local port. You receive a dynamic DNS name at 

1
*.ngrok.com
 which can make local device temporarily web accessible.

We ngrok all the time to demo local web applications to our team and clients before a product is in the cloud. Today though, I just needed to serve some static files to Geckoboard over HTTP.

Equally handy, Python ships with a lightweight (albeit not terribly efficient) web server module. We’ll let Python serve the files and ask ngrok to proxy the local web server so Geckoboard can see it.

We turned on the Python webserver in our project’s output dir:

cd output
python -m SimpleHTTPServer 8002
Python server

And instructed ngrok to proxy port 

1
8002
:

ngrok http 8002
ngrok

And that’s everything we needed to serve the data up for Geckoboard.  We were pretty happy with how it turned out and it was nice to get some fancy local results alongside the national coverage during our watch party (even if things didn’t exactly go the way we had hoped, ahem).

Of course, there are many other ways to accomplish the same thing–some far more robust and stable.  Perhaps closer to real time if you have access to the correct data sources.  

In all, though, we were pretty happy with what could be accomplished in just a couple of hours of relatively low effort.

elx dashboard
Volkswagen 2.0 ABA Spec Sheet

Volkswagen 2.0 ABA Spec Sheet

Notations:
[ $ = OBD I information has not yet been collected ]
[ $$ = OBD II information has not yet been collected ]
[ *** = information has not been verified by any technical data or a reliable source ]

——————-

General (w/5 speed manual transmission)

Motor: 2.0L (1984 cc) I4 SOHC 8V Fuel Injected (121.071 cu in)
Engine code: ABA
HP: 116.6 PS (115 bhp) (85.8 kW)
Hp Peak: 5400 rpm
Torque: 122 ft/lbs
Torque peak: 3200 rpm
Unitary capacity: 496 cc per cylinder
0-60 mph: 10.60 seconds
1/4 mile : ???
Top Speed: 124 mph (200 km/h)
Power-to-weight: 104.83 bhp/ton
Hp per liter: 58.97
Firing order: 1-3-4-2
Engine idle speed: 800-880 rpm ; (with a/c on 830-910 rpm)

1992-1995 = OBDI
1996-1999.5 = OBDII

:wave:[Note: there are 2 different ABA blocks: squirter or non-squirter. you have to drop your oil pan to figure out which one you have. ]

bottom end internal parts / measurements

Block height: 236mm
Bore: 82.50 mm (3.25 in)
Stroke: 92.80 mm (3.65 in)
Bore/stroke ratio : 0.89
Compression: 10:1
Compression height: 30.9mm

Rods

Part Number: 037 198 401 C
Rod journal: 48mm
Rod Type: Forged
Rod length: 159mm
Wrist pin: 21mm

Pistons
:wave:[Note: there are 3 different “shapes” of ABA pistons, I have provided the link to explain the difference. LINK – http://forums.vwvortex.com/showthread.php?3875757-OBDI-vs-OBDII-ABA-engines]

Part Number: 037 107 065 N / 037 107 065 M
Piston type: Cast
Piston dish: 14.61

Crank

OBD I
Part Number: 053 105 101 K
Crank : Steel forged
Type: Short Nose with Crankshaft Trigger

OBD II
Part Number:
Crank: Cast
Type: Short Nose with Crankshaft Trigger

Oil Pump

Part Number: 027 115 105 B
Oil pump: 79mm
Oil pump sprocket: 44T
Oil pump gear length: 36mm
Oil pump bolt: 8x90mm
Operating oil pressure: 29psi minimum ( @ 2000 Rpm, oil temperature 176 degrees F)
:wave:[note: Oil pressure not verified, these are the numbers shown on MY PERSONAL jetta’s oil pressure gauge]

top end internal parts / measurements

Head
:wave:[NOTE: OBDI and OBD II heads are interchangeable]

Part Number: ObdI 037 103 351 M / ObdII 037 103 351 N / Califonia 037 103 351 P
Head type: crossflow
head gasket: 4-layer metal
head gasket layer thickness top to bottom: 0.009″, 0.040″, 0.004″, 0.009″.
Total thickness: 0.062″

Camshaft

Camshaft woodruff key: N 012 708 2

OBD I
Part Number: 048 109 101 D
Camshaft measured @ .050″
Advertised Duration: None
Duration @ .050″: 211*/212*
Valve Lift: .400″
Lift @ TDC: $
Centerlines: 113.2* / 113.8*
Lobe Center: 113.5*
Valve Timing: -7.7/38.7 – 39.8/-7.8
Valve Overlap: -15.5*
In open @ .050″: 7.7° BTDC

OBD II
Part Number: 050 109 101 A
Camshaft measured @ .050″
Advertised Duration: None
Duration @ .050″: 210*/210*
Valve Lift: .417″
Lift @ TDC: ($$)
Centerlines: 110.8* / 109.2*
Lobe Center: 110*
Valve Timing: -5.8/35.8 – 34.2/-4.2
Valve Overlap: -10*
In open @ .050″: 7.7° BTDC

Valve springs

OBD I
Part Number: 078 109 633 A
Valve spring type: Dual rate
Valve spring maximum lift: .450″
Valve Spring Installed Height: ($)
Valve spring compressed height: ($)

OBD II
Part Number: 078 109 623 c
Valve spring type: Single rate
Valve spring maximum lift: .432″
Valve Spring Installed Height: 1.400″ (+/- .005″)
Valve spring compressed height: .945″ (+/- .005″)

Valves

Part Number intake: 037 109 601 E / 078 109 601 E
Part Number exhaust: 037 109 611 B / 048 109 611 B
Intake: 39.5mm
Exhaust: 33mm
Stem: 7mm

Valve Spring Keepers

Keeper Part Number: 021 109 651 (for 1 single half)

Valve Spring Retainers

OBDI Retainer: 021 109 641 c
OBDII Retainer: 078 109 641 c

Exterior motor parts / measurements

Injectors

Bosch part number: 0-280-150-955
Fuel injector type: Top mount
Fuel injector CC/Min: 176
Fuel injector Grams/Min: 126.6
Fuel injector flow rate: 16.75
Fuel injector pressure: 36.25 PSI
Fuel injector impedance: High 12-16Ω

Fuel Rail

Part Number: 06A 133 317 R
Fuel rail inlet: passenger side
Fuel rail inside diameter: ($ / $$)
Fuel rail spacing: 88 mm between 1 and 2; 45mm between 2 and 3; 88mm between and 3 and 4

Throttle body

Bore: 2.4″
Throttle plate: 2.22″
OBD I: includes Dashpot and idle stabilization valve
OBD II: Integrated throttle position switch (replacing the I.S.V. and Dashpot)

Intake Manifold

:wave:[NOTE: OBDI External ISV attached to the exterior of the upper manifold.]

OBD I
(Lower Intake)
Part Number:037 133 206 C
Lower runner length: 6.2″ long
Port inside diameter: 32.5mm (head side)
Port inside diameter: 34.5mm (opening connecting to upper manifold)
Single runner volume: 150cc

(Upper Intake)
Part Number: 037 133 201 AQ
Port inside diameter: ($)
Runner length: ($)
Plenum Volume: ($)

:wave:[NOTE: OBDII upper manfold included vanes immediately forward of where the individual ports begin.]

OBD II
(Lower Intake)
Part Number:037 133 206 C
Lower runner length: 6.2″ long
Port inside diameter: 32.5mm (head side)
Port inside diameter: 34.5mm (opening connecting to upper manifold)
Single runner volume: 150cc

(Upper Intake)
Part Number: 037 133 203 T
Port inside diameter: 34.25mm (opening connecting to lower manifold)
Runner length: 3.875″
Plenum Volume: 1.8L

Exhaust Manifold
:wave:[Note: Some 1995 models will have OBDII exhaust manifolds]

OBDI
Part Numbers: 037 253 031 AP (Early Years, Non-Emissions) ; 037 253 031 AL (Mid Years, and California) ; 037 253 031 BP (Late years and all Canada)
Material: Cast
Type: 2 piece; 4-2-1
Upper Manifold Runner Size:
Lower Manifold Runner Size:
Collector Diameter: 2.25in
Exhaust Manifold Stud: 8X47mm

OBDII
Part Number: 037 253 031 L ; 037 253 031 cc (California)
Material: Cast
Type: 2 piece; 4-2-1
Upper Manifold Runner Size:
Lower Manifold Runner Size:
Collector Diameter: 2.25in
Exhaust Manifold Stud: 8X47mm.

MAF sensor

VW part number: 037-906-461-A
Bosch part number: 0-280-217-103
MAF sensor Housing size: 2.75″

Camshaft Sprocket

Sprocket Part Number: 049 109 111 c
Geer Length: xxx Teeth

Spark plugs / wires

Part Number:
Spark plug gap: .028 (also listed, .024 and .026, anyone have VW’s spec?)
Spark plug wire size: 7mm

Thermostat

Part Number: 044 121 133
Opening temp: 185*
Fully open temp: 221*

Electric Cooling Fans
:wave:[Note: All temperatures measured in F.]
:wave:[Note: There is a second switch that controls a stage 3 fan speed fitted into one of the cooling housings on the cylinder head. This is only applicable on certain models]

Part Number: 1H0 959 455 (no AC) / 1HM 959 455 C (with AC) / 165 959 455 L (either)
Fan Size: 305mm (first two pn’s) / 280mm (last pn)

Stage 1 on: 198* – 207*
Stage 1 off: 183* – 196*

Stage 2 on: 210* – 221*
Stage 2 off: 196* – 208*

Stage 3 on: 230* – 239*
Stage 3 off: 221* – 230*

Alternator

Part Numbers (Valeo): 028 903 025 P / 037 903 023 G (+a/c)
Part Numbers (Bosch): 028 903 025 P / 028 903 025 Q (+a/c)
Pulley Diameter: 49mm (1.929 in)
Regulator Plug Clocking: 8.00
Voltage: 12 volt, Negative ground
Amperage: 90
Minimum brush length

Radiator

dimensions: 675mm x 675mm x 322mm

Expansion Tank

Cap opening pressure: 19-23 psi

Distributor

Part Number: 037 905 237 BX / 037 905 205 T
Type: Breakerless
Ignition Timing: Controlled by EMS
Firing order: 1-3-4-2
Rotation: Clockwise

Ignition System

1993-1995
Bosch Motronic M2.9

1996-1999
Bosch Motronic M5.9

Coil

Primary resistance: 0.5Ω to 0.7Ω
Secondary resistance: 2 kΩ to 4 kΩ

Water pump

Part Number: 037 121 005 C (housing with impeller) / 037 121 010 C (water pump with sealing washer; without pulley, thermostat, and adapter (gooseneck))

PCV valve

Part Number: 037 129 101 H / 037 129 101 R

Vacuum brake booster

Part Number: 1H1 612 107 C (w/out ABS) / 1H1 612 107 D (w/ ABS)

Master Cylinder

Part Number: 357 611 019 B (w/out ABS) /1H1 698 019 B (w/ ABS)

A/C compressor

Part Number: 1H0 820 803 D
High side Psi: 205.0
Low side Psi: 17.0

Fluids / fluid measurements

Oil

Oil type: API grade SH or SH/CD multi-grade oil
Maximum oil capacity (including filter): 4.2 Quarts
Oil Viscosity: 5w40 or 10w40 (viscosity is temperature dependent, other oils may be applicable)

Fuel

Fuel type: Gasoline
Fuel octane: All standard octanes acceptable
Fuel pressure (regulated): 36 psi
Maximum fuel capacity: 14.5 gallons

Coolant
:wave:[Note: NEVER EVER cross mix different color anti-freeze.]

Coolant type: 50/50 mixture of water and coolant
OBDI maximum coolant capacity: 5.8 Quarts
OBD II maximum coolant capacity: 6.1 Quarts

Automatic Transmission Fluid

Trans fluid type (1994 and earlier): DEXRON II
Trans fluid type (1995 and later): VW transmission fluid ONLY
Maximum trans fluid capacity: 3.2 Quarts
VW transmission fluid part number: G 052 162 A1 or G 052 162 A2

Brake Fluid

brake fluid type: DOT 4
maximum brake fluid capacity: ($ / $$)

Power Steering

Power steering fluid (Recommended): VW PS fluid (the regular stuff will do)
Power steering fluid capacity: 1.6 Quarts
VW PS fluid part number: g002000 or G002012

Air Conditioning

A/C oil type: r134
Maximum A/C fluid capacity: 28 oz of R134a – 3.9 oz (total) of PAG based oil

Transmission

5 speed manual

Transmission code: 020
transmission type: DFQ. CHE, or AMC
Main shaft: 24mm (after June 1st, 1997, shafts are 22mm)
speedometer gear: 15T
1st gear ratio: 3.455
2nd gear ratio: 1.94
3rd gear ratio: 1.28
4th gear ratio: 0.97
5th gear ratio: 0.80
final drive: 3.67

Automatic

Transmission type: CLK, CFH, CFF
Number of gears:
Dimensions
Gear ratios:

Fuse Box / Relays

:wave:[Note: The crappy diagram I have drawn shows the layout of the relays as you are facing them]

Location: Drivers side, under dash, above clutch pedal

[19] [20] [21] [22] [23] [24]
[13] [14] [15] [16] [17] [18]
——————————–
[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]
[ 7 ] [ 8 ] [ 9 ] [10] [11] [12]

1 air conditioning system
2 rear wiper/washer
3 fuel inchection/ignition system
4 Load reduction
5 not used
6 emergency flasher
7 not used
8 Windshield wiper/washer
9 Seat belt warning system/control unit
10 Foglights
11 Horn
12 Fuel pump
13 Heated oxygen sensor control module (o2 sensor)
14 Park/Neutral position
15 – 24 Optional equipment (does anyone have the relay equipment information for these?)

non categorized stuff

Cylinder Head Bolts diagram and torque specs

tighten in the following order:
_____________________
10…..4……2……6……8

7……5……1……3……9

stage 1 30ft/lb
stage 2 44ft/lb
stage 3 additional 90 Degree turn
stage 4 additional 90 Degree turn

Torque specs (ft/lbs unless otherwise stated)

LISTED ALPHABETICALLY

Air temperature sensor: 84 in-lbs
Alternator mounting bolts: 18
Camshaft bearing cap nuts/bolts: 15
Crankshaft main bearing cap bolts: 48
Engine crossmember-to-body bolts:37
Exhaust manifold bolts: M8 bolts = 18 ; m10 bolts = 30
Flywheel mounting bolts: 44
Fuel rail mounting bolts: 84 in-lbs
Intermediate shaft flange bolts: 18
Intermediate shaft sprocket bolt: 59
Lock carrier-to chassis bolts: 17
Lock carrier to fender screws: 48 in-lbs
Intake manifold to head (lower): 18
Intake manifold to lower intake (upper) = 15
Lug Nuts (wheel bolts): 81
Oil cooler nut: 18
Oil pan drain plug: 22
Oil pump cover bolts: 84 in-lbs
O2 sensor (heated oxygen sensor): 37
Piston oil jet/pressure relief valve: 19
Rod bearing cap bolts/nuts : 22
Spark plugs: 22
Starter mounting bolts: Lower 33 ; Upper 44 ; Stud 44
Throttle body through-bolts: m6 bolts = 84 in-lbs ; m8 bolts = 15 ft-lbs
Timing belt tensioner bolt: 33
Transmission bell housing to engine: m10 bolts = 44; m12 bolts = 59

Taken from VWVortex and put here so I won’t lose it.

A message to all streamers

A message to all streamers

Never forget where you came from and the people that put you there.

I once was a regular driver for Donna Summer. The first time I drove for her, of course I had to carry her luggage to the gate at the airport. I never said anything to her about this as it really didn’t bother me but I had a sense some other driver may have had an issue with it. But all the way from the car to the gate, she would stop and hug every person that said her name. She turned to me and said, “Chris, if it wasn’t for them, I wouldn’t be where I am today”

Good streamers recognize that the only value they have on their platform is the people that watch their streams. Imagine doing a stream and no one is watching, or maybe one person is watching. Imagine how you feel knowing that you are essentially wasting your time streaming to zero or one person.

Now imagine streaming to 100 people and not recognizing them. In essence, you have turned the tables and are now wasting their time.

Streaming is about inviting people into your home and those people need to be just as respectful as if they are standing in your house with the same gratitude and grace. But this is also a two way street. You too also need to be a gracious and giving host, otherwise your stream will fail.

When you include streamers in whatever you are doing, you are increasing the Camaraderie within the community. You, as a streamer, cannot survive long as a streamer without your viewers. You can be the best streamer in the world, but the second you forget where you started is the second you will lose viewers.

I’ve noticed when streamers get affiliate status, or actually just before that. When they need to hit that threshold to affiliate status. Their attitude is very different. Then, when they’ve obtained that goal, all the sudden they’ve changed. They go into a subversive viewer chokehold because they don’t have to beg for those last 15 follows or hit their sub goals. I don’t blame streamers entirely, a lot of the blame should go towards the platform they’re on. The platform is just as toxic as some streamers tend to be after they’ve hit an achievement.

The goal of a streamer is to be entertaining, inviting, warm and social. If you can’t be all 4, then you have no business streaming at all. Being a streamer is just something you’re born with and not something you think you can pull off because someone else has. The majority of twitch is infected with women in hot tubs talking about random shit and there’s 11,000 people watching, while someone that’s more creative and entertaining is barely able to muster a few views. I just find it fascinating that we as a species tend to go for the “dumbed down” version of humanity. Sure pretty girls are something to watch, but if it isn’t artistic, it’s just a buncha dudes watching a girl swim around in a tub. Think about that for a moment.

Let’s remove the streaming aspect of it and say the girl is on a physical stage, in a hot tub, and there’s 11,000 physical people watching her in the hot tub. Feels and seems kinda dumb don’t it? Yup. So let’s all keep this in perspective. I’m not blaming streamers entirely for this problem. It’s also the people that buy into this garbage that have the most to do with it. Seriously, if the viewership goes up, why should the streamer stop doing what they’re doing if this is what their viewership wants?

Seriously, consider your stream and also reach out to the community and support other streamers that can use the same grace and gratitude people have shown you. When you build others up, we all become stronger.

I follow a few streamers on Twitch and a few on youtube. There are some really good streamers out there that don’t get enough viewership when they should but who am I to say? However, when people are promoting
other low end streamers on higher end streamers, they seem to fall on deaf ears. There are some communities that i’m in and I notice this disconnect pattern all the time, so I just shut the stream off and move to the next.
I’m always looking for underdog streamers to help build their community up. I’m not one for pretentiousness. Actually, I don’t like it at all. I don’t like fake people. I like genuine people that have
genuine interests. If I get the feeling a streamer is being pretentious, I’ll shut it off. I enjoy genuine connections with people and when I notice a genuine disconnect, I’ll do the same.

Streamers, if you don’t use your “power” to help other people, what are you really in it for? Why are you willing to risk everything for more power, when the power you seek is in the people that watch you? Don’t be “that guy” and ignore your community once you’ve hit affiliate status. You’re just going to regress backwards for the sake of power. Don’t forget who put you where you are now. Don’t forget the little people that take their time to watch you and try to engage with your platform. If you are in this for the money, I got some bad news for ya. You are no different than those hot tub girls. Sure, money is nice, but establishing the best community or one of the best communities is something all streamers should strive for. When you forsake your community, you are only cutting your own throat. Never forget this.

The Importance of Degoogling Your Phone And Why It’s Ethically Sound.

The Importance of Degoogling Your Phone And Why It’s Ethically Sound.

First of all, if you have an iPhone I can’t help you other than to tell you to get rid of it and get an Android phone with an Unlocked Bootloader or capable of Unlocked bootloader. iPhones and anything Apple are notoriously known for locking their operating systems down to where no one can do anything about it and while there are Jailbreak methods out there, it is getting increasingly difficult as the days progress. Personally, I have issues with anything closed-source and will try to refrain from using any software that won’t allow me to see the inner-workings. I wanted to get this part out of the way first and foremost so that Apple users finding this won’t waste their time. To put it simply, iPhone users are at the mercy of Apple. You are forced to trust them and well, for me, I 100% trust myself and not Apple. Do yourself a favor and get rid of it, it isn’t serving you well. If your argument is that iPhones have the best camera, well my argument to that is there are thousands of cameras that are way better and will not expose you to privacy issues.

Ok, so you are on Android and you are concerned about your privacy but you just aren’t sure you want to go as far as modifying your phone as you feel that you’re sure you have nothing to hide. “Why should it matter to me about my privacy, I have nothing to hide.” and this is a good question. There’s a lot of good people in the world that don’t have anything to hide but what it all comes down to is should you give up your privacy so easily? Something so benign as signing up for Gmail just to lock in that account on your phone and to have access to all those apps that make your life easier. The trade-off to this is, you are quite literally selling yourself to Google and whoever else wants to buy this information. This is how tech companies make money. Currently, there are over 2 billion Google-enabled phones in the world, probably more. Let’s just say that each phone generates a Penny a day, that’s 20 million dollars in one day USD. I would put money on that the “Penny a day” varies from user to user so i’m being conservative in my value here with the lowest absolute value just to get my point across. That’s $20 Million dollars a day that Google is making just for phones to be on. Ok, Google employees have to eat, companies have to thrive and that’s fine.. This is how Capitalism works. Ok, how Google makes even more money is it aggregates this data down to demographics (Age, Race, commonalities, religion, ethics,etc) and then it sells this data to whomever needs this data and feeds it to them in real-time. It doesn’t matter at this point if Google is tracking you and giving your identity to third-parties, this is obvious. No, this is privacy on the point of where you are a Currency-generating human with a tracking devices that is monitoring everything you do, everything you hear and everything you say and albeit probably reading your mind at this point. (Don’t laugh at me for being conspiratorial… You’ve thought something and it’s shown up in a search before so don’t call me crazy)

Privacy should be of great concern for everyone but in our society of “I Don’t Care”, this is how Apple and Google thrive. This is how they make money, by using you unknowingly. Just look at the marketing hype when a new phone comes out. “We’ve updated our camera!” “Our camera is the best camera says JD Powers and Associates” etc, etc. Listen very closely to the buzzwords in their commercials when a new phone comes out like the Samsung A21, which hardware spec wise is a very good phone, but the software tied to the hardware will have you generating even more money for your “Pimp”. Seriously, you..the consumer are being prostituted, and you don’t even care. As long as you get your fix, your apps, you’re able to pay with Google Pay and Apple Pay and it makes your life easier, you don’t care. And this “Don’t Care” attitude you have is exactly the type of “Prostitute” they want. You are allowing them to pimp you and at 2 billion plus prostitutes, they are raking in more cash that would solve third-world countries problems while allowing Big-Tech to dump money in lobbies that change the course of whole governments. But look at you, you don’t care. As long as you mindlessly agree to the EULAs and TOSs because “OMFG, this app is the best!” and “OMFG, look at this picture I took, isn’t it gorgeous?”. This is how Apple and Google traps you, by feeding you drugs and it doesn’t cost them anything because a lot of companies are in on it.

You should start caring about your privacy. If you ever need any help with it, contact me. If you don’t want to contact me, Subscribe to this YouTube channel: https://www.youtube.com/c/BraxMe

Linux Desktop Environments

Linux Desktop Environments

This will not be a “Which one is better” article, but more so a list of the current ones that are available so you can find out which one is best for you.

Gnome
Xfce
LXDE
Cinnamon
MATE
LXQt
Enlightenment
KDE Plasma
Budgie
Razor-qt
Lumina
Sugar
Trinity Desktop Environment
K Desktop Environment
Common Desktop Environment (CDE)
Pantheon
ROX
UDE
EDE
Etoile
KDE 4
Mezzo
UKUI
GNUStep
Aqua
OpenWindow
Ambient
Project Looking Glass
Metisse
Elokab

Avoid Firefox like the plague they support, and i’m not talking about Covid-19

Avoid Firefox like the plague they support, and i’m not talking about Covid-19

I’ve used Firefox for quite a number of years but recently after loading up a new web page, I see on the bottom that Firefox is in complete submission to a Marxist organization. Oh, I’m a conspiracy Theorist you say? Black Lives Matter founders are not hiding the fact that they are Marxists so how can this be a conspiracy theory. But Chris, you are generalizing based on what the founders have said, not everyone that supports BLM is a Marxist. Sure, I agree with that statement, but one thing is for certain, I won’t support or even attempt to support someone that is.

Goodbye Mozilla.