Smartphones and Phone-y Pricing

It’s that time of year.  All of the major players in the cellular and smartphone market are “leaking”, announcing, and releasing new phones, just in time for the holidays.

Motorola just officially announced the Droid Turbo 2 and Maxx 2, which are practically copies of each other, save for a couple physical features, and storage on shipment (the Turbo 2 coming in 32gb and 64gb options, and the Maxx 2 coming with 16gb).  Both are priced to what the market will bare, $624.00 (Turbo 2 32gb, no frills), $720.00 (Turbo 2 64gb, no frills), and $384.00 (Maxx 2).  Only the Turbo 2 is enabled in the Moto Maker web app, where frills are abundant, but the only extra cost is the “pebbled leather” option (at $24.00).

Phone Storage Cost
DROID Maxx 2 16gb $384.00
DROID Turbo 2 32gb $624.00-$648.00
DROID Turbo 2 64gb $720.00-$744.00

Google also announced two phones in September, and is shipping one of them now.  The Nexus 6P and 5X (the one that’s shipping now), and like Motorola, they have some options in storage, but not as many frills (only three case color options per device, not nearly as granular as the Motorola offerings).

Phone Storage Cost
Nexus 5X 16gb $379.00
Nexus 5X 32gb $429.00
Nexus 6P 32gb $499.00
Nexus 6P 64gb $549.00
Nexus 6P 128gb $649.00

Hardware comparison wise, the offerings from Motorola win in the camera field in just pure pixel capture.  The Turbo 2 and Maxx 2 come with a 21 megapixel camera built in, as did the Turbo and the international version, the Moto Maxx (not to be confused with the Droid Maxx, which is Verizon only), and the Nexus 5X and 6P come with 12 megapixel cameras.  Reviews from around the Internet say that the 6P is the superior camera in all lighting conditions, but they’re only comparing the 5X and 6P, not against the Turbo lineup.

Let’s focus on just the two bigger phones for the moment, the 6P and Turbo 2.  In terms of hardware, they are equal contenders, but here’s the differences between the two:

Nexus 6P Turbo 2
Networks All of them Verizon
Screen Size 5.7″ (~518ppd) 5.4″ (~544ppd)
Protection Gorilla Glass 4 Shatterproof*
microSD No Yes
Back Camera 12mp 21mp*
Front Camera 8mp 5mp
Qi Charging No Yes
Battery 3450 mAh 3760 mAh
Price (64gb Model) $549.00 $720.00

* We don’t know what Shatterproof means, and I haven’t seen any tests.  How much damage can it take?  Who knows?

** With the DROID Turbo (1), we have a 21mp camera too, but in order to use that, it forces the camera to a 4:3 resolution.  Don’t know if that’s still the case with the Turbo 2.

In that comparison, almost apples to apples, the price difference is $171.00.  The one with the bigger screen, the same chipsets and memory, and minor differences to features, is cheaper.

To the smartphone industry, I ask the question: Wat?

Why the obvious price gap?  Huawei produces the Google Nexus 6P, and is a newcomer to the market, when compared to Motorola, who created the first and most popular cellphone of all time, the StarTAC!  Shouldn’t Motorola have the resources and the contacts to make their phones cheaper?  Or way better than any of the competition?

And why does the price jump by $100 for the Turbo 2 32gb model to the 64gb model, when the Nexus 6P jumps only $50?  While I know phone storage is slightly different, a 32gb flash based storage drive is $20 for the cheap stuff, and a 64gb drive is $30 from Monster.  MONSTER.  The company that seems to enjoy ripping off customers!

So, dear Motorola, I will not be upgrading my phone to the Turbo 2 this year.  Your features are neat, but your price point doesn’t make sense.  Maybe next year.

Encryption and You!

Let’s talk about encryption.

Right now, there’s a number of governmental agencies that are lobbying Congress to push forward the idea that they need full access to communication data when ever it is asked for. To protect the interests of the United States, find criminals, terrorists (foreign and domestic), and other no-good people. Or just people who are up to no good.

There’s a level that I can agree with. I’m okay with some meta data (phone number to phone number and duration, specifically for overseas calls), but not so okay with the recording/listening of those conversations.  But that’s just talking about old school telephony.

Now we live in an age where a rotary phone is nearly extinct, and to call someone, you take a small device from your pocket, touch it a few times, and are instantly connected to another person.  Cell phones, smartphones, and even Voice-over-IP (VoIP) phones are the major way we communicate now.  Some of these methods also encrypt the communication line between parties, and some plainly encrypt the entire device.

Computers, tablets, and smartphones all now ship with some way to encrypt and secure the data of the device.  Computers have had Trust Platform Modules (TPM) for a few years now, though we’ve had encryption software like TrueCrypt (and it’s new forks) for many more years, and Android and iOS have had encryption available since Gingerbread 2.3.4 and iOS 4, respectively.

The agencies want access to that encrypted data when ever they want.  They’re not mentioning search warrants in their discussions, by the way, which just sets off some alarms.  While I understand what they’re asking for, they are also asking for the keys to the kingdom.  They want the device, service, and software providers to turn over encryption keys when ever they ask, bypassing the search warrant process in an effort to extradite the prosecution of crimes.

A court just ordered that a pair of financial investors , who are being accused of insider trading, cannot be ordered to provide passwords to their phones because of their encryption, so therefore the Fifth Amendment is being upheld in this case (right to protection from compelled self-incrimination). [Article on Ars]

As a matter of personal opinion, I have no reason to encrypt any of my devices.  But the “I have nothing to hide” statement is only for those who don’t care enough about their personal data.  I don’t encrypt to hide anything from the United States government.  I encrypt to put a measure of difficulty for someone who steals my phone, my laptop, or my computer.  I encrypt my backups, my online storage data, and make passwords as long and as complicated as the systems allow.  This is to protect me and my family.

Therefore, here is my proposal: If the agencies of the United States government want full, backdoor access to our encrypted data (which is still a bad idea), we want the Digital Millennium Copyright Act (DMCA) revoked.  Simply, if they want tech companies to reverse-engineer the existing encryption technology, that would be breaking the laws from the DMCA, and thus self-incriminating.  If we can’t tinker with our own devices, neither should the government.

Wordfence and Missing Tables

Wordfence is a great plugin for WordPress sites.  Great for managing, notifying, and all around blocking malicious activity.  It’s one of the more highly touted security plugins, and it earns its title.

However, after an update a while back, they added a Dashboard widget, which gives you an at-a-glance info tool for what Wordfence has done for you lately.  But, my error log, and the lack of data, showed there was a problem.  My version simply would not create the required tables, even when fully removed and reinstalled.

I took the error log from the reinstall, which stated that it could not create the table, and spit out the query it was trying to use (in this case, two tables).  I tried to execute the queries, but was met with errno: -1.

The trick was to create the tables with a different name, and then rename them to the proper version.  Here’s the two original queries used in the install:

Selec All Code:
CREATE TABLE IF NOT EXISTS wp_wfFileChanges (
 filenameHash CHAR(64) NOT NULL PRIMARY KEY,
 file VARCHAR(1000) NOT NULL,
 md5 CHAR(32) NOT NULL
 ) DEFAULT charset=utf8
Selec All Code:
CREATE TABLE IF NOT EXISTS wp_wfBlockedIPLog (
 IP INT UNSIGNED NOT NULL,
 countryCode VARCHAR(2) NOT NULL,
 blockCount INT UNSIGNED NOT NULL DEFAULT 0,
 unixday INT UNSIGNED NOT NULL,
 PRIMARY KEY(IP, unixday)
 ) DEFAULT charset=utf8

Rename the wp_wfFilesChanged to be something like wp_wfFilesChanged2 in the query, then after the table is made, rename it back to wp_wfFilesChanged.

If you don’t know how to do any of this, do not muck around in your SQL table without consulting someone who understands them.

Distribution of Big Files

I had a problem a while ago, with the use of VMs in classrooms and labs.  Let me tell you, no matter where you are, if you have 25+ computers that need to have a local VM (because you don’t have a VDI in place, let alone budgeted), you’re going to experience a bottleneck, and your network admin is going to come running down the hall with screams of distress (yes, I’m talking to you, Josh).

There are very few things that can help in this case.  SCCM can do the job, but it’s not very expedient or elegant.  Pure Windows File Transfer is almost guaranteed to cause issues for anyone trying to connect to the file server.  PDQ Deploy is good, because of queuing, but it’s not really meant for files over 5gb in size.

However, there is one protocol that we’ve learned over the years is perfect for large file transfers to multiple computers: BitTorrent.  Yes, that strange, copyright enticing protocol that has caused ripples across the tech industry and law makers alike.  Please remember, it’s merely a tool, and it matters how you use it.

Let’s continue with the example of Virtual Machines, as those are roughly 10-20gb in size.

First, create your torrent file, preferably on the file server, so it can act as the primary seed.  If you add a tracker, use the file server, since you want this only in your local intranet.

Second, I suggest setting up a Uniform Server or XAMPP for serving your new .torrent file, and BTStorm (the MySQL branch) to act as your tracker.  You can use a file share, but this takes out any authentication issues.

Next, via scripting on your client machines, use Aria2 to grab the .torrent file from your server, and start pulling the files.

Selec All Code:
ShellExecuteWait("C:\aria2\aria2c.exe", "http://webserver/file.torrent --file-allocation=none --bt-enable-lpd=true --bt-tracker=<trackerURL> --on-bt-download-complete=ariapskill.cmd --allow-overwrite=true --dir=C:\ -q")

This simple line of AutoIt script will execute the Aria2 CLI, hidden from the users’ view, and begin downloading the torrent data.  It also uses local peer discovery, so when you’re doing massive numbers at one time, things will go much faster, and no longer bog down your network, or bottleneck at your server.

When the file transfer is complete, instead of running until the computer is rebooted, there’s a configuration line that executes a command to kill the aria2c.exe process (–on-bt-download-complete=ariapskill.cmd).  I used PSKill, from SysInternals, which might be the best way to go about it.

All in all, the use of Aria2 is an easy way to distribute large amounts of data in a short amount of time, and keep your servers from having I/O issues.

AutoIt – Flash Player

At some point in the last year, the folks over at Ninite.com were asked by Adobe to stop serving Flash Player via their free service.  If you paid, you could include Flash Player in the bundle.  However, pricing for 3,500 Windows computers gets steep really quickly, in the eyes of many purse-string holders.  So here’s a bit of code that should help you get Flash out there, directly from Adobe, without a technician needing to be present. Remember to either comment out the Admin check section, or replace the credentials accordingly, so users can run it without a problem.

Selec All Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <Inet.au3>
#include <String.au3>
#include <Array.au3>
 
;Ensure running as Administrator account
If IsAdmin() = 0 Then
	RunAs("<administrator>", @ComputerName, "<password>", 1, @AutoItExe)
	Exit(2)
EndIf
 
;Pull the web page source for parsing
$tempFile = FileOpen(@TempDir & "\FPTemp.txt", 2)
FileWrite($tempFile, _InetGetSource("http://www.adobe.com/products/flashplayer/distribution3.html"))
FileClose($tempFile)
 
;Read the file, and use a regex to find our current version
$version = StringRegExp(FileRead(@TempDir & "\FPTemp.txt"), "([0-9\.]{10} \(Win and Mac\))", 3)
$version = _ArrayToString($version, "", 0, 0)
ConsoleWrite($version & @CRLF)
 
;Cut it up to get our actual version info
$netFullVer = StringLeft($version, 10)
ConsoleWrite("Full Version:  " & $netFullVer & @CRLF)
$netBigVer = StringLeft($netFullVer, 2)
ConsoleWrite("Major Version: " & $netBigVer & @CRLF)
$netTinyVer = StringRight($netFullVer, 3)
ConsoleWrite("Patch Version: " & $netTinyVer & @CRLF)
 
;Check our local version, and cut it up as well
$regFullVer = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayer", "CurrentVersion")
If @error then
	ConsoleWriteError("Error reading key: " & @error & @CRLF)
	GetFlash()
	Exit
EndIf
$regFullVer = StringReplace($regFullVer, ",", ".")
$regBigVer = StringLeft($regFullVer, 2)
$regTinyVer = StringRight($regFullVer, 3)
ConsoleWrite("Local Full Version:  " & $regFullVer & @CRLF)
ConsoleWrite("Local Major Version: " & $regBigVer & @CRLF)
ConsoleWrite("Local Patch Version: " & $regTinyVer & @CRLF)
 
;Compare the major version, if the same, check minor, install as needed
If $netBigVer > $regBigVer Then
	GetFlash()
ElseIf $netBigVer >= $regBigVer And $netTinyVer > $regTinyVer Then
	GetFlash()
EndIf
 
Func GetFlash()
	InetGet("http://download.macromedia.com/get/flashplayer/current/licensing/win/install_flash_player_" & $netBigVer & "_active_x.msi", @TempDir & "\install_flash_player_" & $netBigVer & "_active_x.msi", 1)
	RunWait("msiexec.exe /qb- /i " & @TempDir & "\install_flash_player_" & $netBigVer & "_active_x.msi", @TempDir)
 
	InetGet("http://download.macromedia.com/get/flashplayer/current/licensing/win/install_flash_player_" & $netBigVer & "_plugin.msi", @TempDir & "\install_flash_player_" & $netBigVer & "_plugin.msi", 1)
	RunWait("msiexec.exe /qb- /i " & @TempDir & "\install_flash_player_" & $netBigVer & "_plugin.msi", @TempDir)
EndFunc

 

 

†: You must have a redistribution agreement with Adobe to use the MSI package.

Goodbye, GCC

Ladies and gentlemen

For the last thirteen years, GCC has been my home. I started here in 2002, as a student, and graduated in 2005. I walked off the stage, and was hired as a board approved employee a few months later. I met my wife at the campus, and created the most wonderful friendships anyone could hope for. Glendale is a place I will miss, between my coworkers and the students I’ve helped through the years.

I’ve climbed what few rungs there are for a PSA in IT, and have found myself wanting, and for the last three years, waiting. There is so much more I want to do, however the organization (not just GCC, but the whole of Maricopa) needs to gather together to move forward. The potential is there, as is the talent, and the willingness to be a team. There are barriers that hinder that movement, but with the right driving force, those hindrances can be overcome.

I am officially resigning my position with Maricopa Community Colleges, my team, and my GCC family, effective January 27, 2015.

Thank you all for the memories,
R. Bryan Adamson

Yet Another EVE Mining Utility – YAEMU

There’s a project I’ve been working on for some time, and I’d like to share it finally.  It’s one of those “Yet Another” project titles, this time as a utility for EVE Online for the miners out there.

The basics of this is all about how big the asteroid is, how much the mining laser can extract per cycle, and how much ore can fit in the ship.

Here’s a scenario:

You’re flying a Mackinaw, a medium Type 2 strip miner.  It’s ore hold, at maximum skill, is 35,000 m3, and a total of two turret slots (which you should use Modulated Strip Miner IIs with the appropriate ore crystals), which can net you 1,842.02m3 per power cycle, per turret.

Not every asteroid contains 1,842.02m3 exactly.  That’s a problem for the long run, since while you can go out and start mining away at asteroids, you’ll never hit exactly that target number.  Plus, the longer you let your turret mine an empty asteroid, the more likely the mining crystal is going to be damaged, which will cost you money in the long run.  Do the math, and it’s just over 9 cycles with both turrets running, and over 27 minutes to fill your ore hold.

That’s a long time in space.  Longer if you’re in nullsec.  So you have to be as close to exact as you can, and get back to the station.

So that’s where my utility comes in.  Punch in your stats, choose what you’re mining, and mine away.  Comes in Regular and Mini flavors, just depends on how much data you want to see.

There’s an extra, called HoldInfo that will help narrow down how long is left until the hold is full.  Works similar to the main utility, but uses the quantity data put into the main utility to figure out how much is left until the hold is full.

So I’m comfortable with releasing this.  It’s completely open for alterations, forks, and comments.  No, of course this doesn’t take into account mining drones, nor does it take into account mining gangs with an Orca behind them.  If you’re getting buffs from an Orca, run the Config tool before running the utility.

If you’re interested, the project is up at Bitbucket: https://bitbucket.org/Harshmage/yaemu

 

Computer Builds of 2014

This last Summer, my father-in-law began to indulge in Warcraft again, and quite frankly, his laptop couldn’t handle it.  So, of course, he asks me if he should by an Alienware, or some other pre-built computer from different manufacturers.  After answering questions, I offered to build him a new rig, and then that opened up a whole plethora [do you know what a plethora is?] of options.  In the end, we acquired parts, and I assembled the Beast.

Case Corsair Graphite 600T White $179.00
Motherboard MSI 990FXA-GD65 v2 $149.00
CPU AMD FX-8350 8-core 4.0ghz $159.00
CPU Cooler Zalman CNPS9500A-LED 92mm $42.99
Memory G.Skill Ripjaws X Series 16GB DDR3 1600 $164.99
Graphics Asus AMD R9 290 4GD5 $349.99
HDD WD 1TB Black $69.99
PSU Seasonic 660w 80+ Platinum $144.99
Total Value: $1,259.95

We got almost all of the parts cheaper than what I’m listing.  The R9 card was an eBay purchase for a deep discount, but everything else was completely new.  In the end, I think we spent $700 on the entire build.  Not too shabby, I gotta say.

But then I got to build my wife a new box, and did exceptionally well:

Case Corsair Graphite 600T Grey $60.00
CPU AMD A10 7850 3.5ghz w/ R7 graphics $169.99
CPU Cooler Zalman CNPS9500A-LED 92mm $42.99
Memory G.Skill Ripjaws Series 8GB DDR3 1600 $83.99
HDD WD 1TB Blue $57.99
PSU Corsair CM450w 80+ Gold $69.99
Disk Asus Blu-Ray Read/DVD-CD Write $57.99
Total Value: $542.94

 

Site Redesign and Realignment

It’s that time again!  This time, I’m redesigning to meet my company goals and skills.  I’ll still have the blog over here, so I can talk about tech, brews, and other stuff.

And no, I haven’t quit my day job.  We’re still over here, making system images, programming in AutoIt, and now making a new CMDB to replace GLPI (iTop).

Google Chrome – Always Download the Latest

As a Desktop Admin, I’ve found certain tasks to be very bothersome.  Some apps just get updated far too often for any single person to monitor, Chrome being one of them.

I attempted to find a static link to download Chrome on a regular basis, and there is a solution, but nothing official (of course).  If you download the Chrome MSI, you’ll see the URL where it’s coming from as some long, gigantic string that only makes some sense.  It looks something like this:

Selec All Code:
1
https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26iid%3D%7B9B88D2E6-EF2A-B40D-C07B-95D6CA14875C%7D%26lang%3Den%26browser%3D4%26usagestats%3D0%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers/edgedl/chrome/install/GoogleChromeStandaloneEnterprise.msi

To break it down, translate the %xx code to the true character encoding:

Selec All Code:
1
https://dl.google.com/tag/s/appguid={8A69D345-D564-463C-AFF1-A69D9E530F96}&iid={9B88D2E6-EF2A-B40D-C07B-95D6CA14875C}&lang=en&browser=4&usagestats=0&appname=Google Chrome&needsadmin=prefers/edgedl/chrome/install/GoogleChromeStandaloneEnterprise.msi

The good part is, you can break this down to make a URL request simpler.

  • appguid={8A69D345-D564-463C-AFF1-A69D9E530F96} is the key piece of the URL that NEVER changes.  Definitely keep.
  • iid={…} section is unique to the download session, so it can be tossed out.
  • lang=en section is default to US/GB English, but can also be removed as it’s the default of the application.
  • browser=4 means…I have no idea, but it’s not needed for immediate download.
  • usagestats=0 I believe is a statistic report to the Google servers on download stats.
  • appname=Google%2520Chrome (which ends up saying Google Chrome with a space) is also superfluous.
  • needsadmin=…  is a keeper, otherwise the URL won’t work.

In the end, here’s what the URL looks like:

Selec All Code:
1
https://dl.google.com/tag/s/appguid={8A69D345-D564-463C-AFF1-A69D9E530F96}&needsadmin=prefers/edgedl/chrome/install/GoogleChromeStandaloneEnterprise.msi

Bonus Round: Here’s a bit of code in AutoIt that will help with deploying Chrome (the Business MSI) to your environment (use only if you have a decent Internet connection speed to the desktop):

Selec All Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Run_Obfuscator=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
 
#include 
#include 
#include <_FileGetProperty.au3>
 
;Ensure running as Administrator account
If IsAdmin() = 0 Then
	RunAs("", @ComputerName, "", 1, @AutoItExe)
	Exit
EndIf
 
;Set paths and existing version info
If @OSArch = "x64" Then
	$ChromePath = "C:\Program Files (x86)\Google\Chrome\Application\"
	$installedVer = FileGetVersion($ChromePath & "chrome.exe")
Else
	$ChromePath = "C:\Program Files\Google\Chrome\Application\"
	$installedVer = FileGetVersion($ChromePath & "chrome.exe")
EndIf
 
;Get Chrome MSI
InetGet("https://dl.google.com/tag/s/appguid={8A69D345-D564-463C-AFF1-A69D9E530F96}&needsadmin=prefers/edgedl/chrome/install/GoogleChromeStandaloneEnterprise.msi", @TempDir & "\GoogleChromeStandaloneEnterprise.msi", 1)
;~       https://dl.google.com/tag/s/appguid={8A69D345-D564-463C-AFF1-A69D9E530F96}&iid={this is random}&lang=en&browser=4&usagestats=0&appname=Google Chrome&needsadmin=prefers/edgedl/chrome/install/GoogleChromeStandaloneEnterprise.msi
 
$dlVer = _FileGetProperty(@TempDir & "\GoogleChromeStandaloneEnterprise.msi", "Comments") ; Returns an array with all properties of the file
 
If StringInStr($dlVer, $installedVer) Then
;~ 	MsgBox(0, "Vercheck", "Same-same" & @CRLF & "Local Ver: " & $installedVer & @CRLF & "DL Ver: " & $dlVer)
	FileDelete(@TempDir & "\GoogleChromeStandaloneEnterprise.msi")
	Exit
EndIf
 
;Remove the policies that might stop the Chrome install
RegDelete("HKLM\SOFTWARE\Policies\Google")
RegDelete("HKLM\SOFTWARE\Google")
ShellExecuteWait("sc", "config gupdate start= auto", "", "", @SW_HIDE)
ShellExecuteWait("sc", "start gupdate", "", "", @SW_HIDE)
 
;Install Chrome
RunWait("msiexec.exe /qb-! /norestart /i " & @TempDir & "\GoogleChromeStandaloneEnterprise.msi")
 
;Copy the master_preferences file to the appropriate directory
FileCopy(@ScriptDir & "\master_preferences", $ChromePath, 1)
 
;Disable Google Update
RegWrite("HKLM\Software\Policies\Google\Update", "AutoUpdateCheckPeriodMinutes", "REG_DWORD", "0")
ShellExecuteWait("sc", "stop gupdate", "", "", @SW_HIDE)
ShellExecuteWait("sc", "config gupdate start=disabled", "", "", @SW_HIDE)