Most Android Apps can easily be decompiled to remove the ads

Trying to reach even non-computer people

This is a long post. Most of it is instructions for modifying Android apps for your own purposes. In the first portion, in which I talk about motivations, I will attempt to make it interesting even for non-computer people:
  • I was surprised how easily and well java sources can be recovered from any Android app
  • It’s easy to customize apps. You can easily change the pictures and the sound clips.
  • Banner ads in kids apps are surprisingly easy to remove
  • Some commentary on kids apps in general
The second part is a how to:

Android apps for little kids

As a parent, I’ve looked around for some good games for my two kids, aged 3 and 6. 1 There are some good ones out there. For example, all of the apps produced by Lego are excellent2. We look for educational ones. Endless Alphabet is a good one.3 Wonster Words.4 Beck and Bo is excellent…. There are some companies out there making great games for kids.
A step down from these, but still pretty good are games like FireFightersFireRescue. It’s a fun app and it appeals to little boys who are enamored with fire fighter related stuff. 5 The downside is that it’s got a big banner along to bottom for ads, and for adult users, that’s not a problem. This game involves moving a firetruck ladder to rescue people stuck in the building. It’s easy for little fingers to get dangerously close to the ads area. Even my 6 year old daughter doesn’t have perfect tablet swiping fingers6. So my son often clicks ads; ads that he has no chance of being interested in. Looking at the screenshot below, I don’t think he’s looking for a free ebook from resources.office.com.

Banner ads don’t really make sense for kids games

App developers need to make a living. As device users, we’ve voted that we don’t want to pay for anything. So instead of the apps being the product, we users have become the product; developers sell their users to advertisers. Ads is the main game in town. 7
Still, it doesn’t seem that ads make sense for little kids. Surely Google has thought about this and I imagine they’re in a bind. They want ad revenue, but they also don’t want the perception that they’re not friendly to kids. They have to know that some of their ads are served to an entirely inappropriate audience.
Anyway, my son enjoys playing the game. As parents, my wife and I don’t enjoy helping him get back to it after he clicks the ad. So I went to the playstore to find a paid version of the firefighter game without ads.
They don’t offer an ad free one. Bummer.

Looking for adblocking led to the rabbithole

Kids games like the firefighter game are pretty common, otherwise, I’d have just moved onto the next game. As a computer guy, I figured I’d look for a way to make these games more playable. As happens so often, I was led down a rabbithole.
I started by trying an adblocker. That didn’t work. The ads were just replaced with offers about their other apps, however, in the process, I stumbled on the youtube video below. They make it look so easy. More important, it made me curious about how apps are put together.8

In the end, I was successfully able to remove ads from the firefighter app. How I did this, is next in this post.

Finally the instructions

I am writing these instructions based on running in a fresh virtualbox install of ubuntu 16.04. The only prior thing I’ve installed is emacs24. I mention it because maybe other stuff gets installed with it. I’ve split this section into four parts:
  • installation of the needed tools
  • setting up your android device
  • using the tools to unpackage and decompile
  • selective recompile and repackage

Installing the tools

The instructions later in this post will want an env var APK_TOOLS that points to an area of installed tools.
In these install instructions, I’m attempting to enable you to simply cut/paste the commands. Things will be installed in groups. The main exception to this is Oracle’s java and Google sdk manager. The reason for this, is that the installers insist on you typing y to agree to their terms and conditions.

Java 1.8

Oracle doesn’t make it convenient to install java on ubuntu. So we get it from an alternate place. I’m usually wary of such alternates, but I found a couple sites that directed me here. In particular, this askubuntu answer:
http://askubuntu.com/questions/464755/how-to-install-openjdk-8-on-14-04-lts
The installer will ask you to accept some license conditions.
[code]
sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
sudo apt-get -y install oracle-java8-installer
[/code]

android buildtools

At the end of the process to put an app back on your device, you will need to sign it. If you have android studion ide installed, the signer comes with the buildtools package which will probably end up in your home dir $HOME/Android/Sdk/build-tools/25.0.2/apksigner. This is the way to go if you think you might want to do android development.
Here I’m going to describe a less heavy handed way. First we need the sdkmanager https://developer.android.com/studio/index.html#downloads. We’ll then use the sdkmanager to install buildtools.
[code]
cd $APK_TOOLS
mkdir android_tools
cd android_tools
wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
unzip tools_r25.2.3-linux.zip
# tools/bin/sdkmanager –list
# –> build-tools;25.0.2 | 25.0.2 | Android SDK Build-Tools 25.0.2
mkdir sdks
tools/bin/sdkmanager –sdk_root=sdks ‘build-tools;25.0.2’
[/code]

32 bit support, apktools, dex2jar, luyten, jdgui, adb, zipalign

adb, in this context, is used to copy apk files from/to your device. apk files are what you’re downloading from the playstore when installing apps.
Apktool is used to package/unpackage apk files. It can be installed using the normal Ubuntu package system, but that version gives me errors. Instead, these instructions download apktool directly from the website.
Compiled Java code is normally stored in jar files. In android apk files, the are in dex files. dex2java is used to convert between the two.
Luyten and JDGui are two java decompilers. They seem pretty good. My main gripe with them is that they both insist on you using the GUI.
zipalign is part of the apk signing process. signing is important for security reasons. We don’t want people accidentally installing fake Chase or Bank of America apps. The android OS requires signing before it will allow you to install an app.
From a small comment in the apktool instal instructions: https://ibotpeaches.github.io/Apktool/install

Make sure you have the 32bit libraries (ia32-libs) downloaded and installed by your linux package manager, if you are on a 64bit unix system.
(This helps provide support for the 32bit native binary aapt, which is required by apktool)

To fulfill this requirement, we’ll follow these instructions: https://blog.teststation.org/ubuntu/2016/05/12/installing-32-bit-software-on-ubuntu-16.04/
Because sudo asks for your password, I find it useful to do “sudo ls” right before cut/pasting these.
[code]
# 32 bit stuff
sudo dpkg –add-architecture i386
sudo apt-get update
sudo apt-get -y install libc6:i386 libstdc++6:i386
sudo apt-get -y install zlib1g:i386
# adb git zipalign. (I think I don’t really need git anymore)
sudo apt -y install adb git zipalign
# Apktool
# APK_TOOLS is a directory where you want these to be installed.
cd $APK_TOOLS
mkdir Apktool
cd Apktool
wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.2.2.jar
ln -s apktool_2.2.2.jar apktool.jar
wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
chmod ugo+x apktool
# This package works in windows and linux. Since I use linux, I want all of the sh files. Let’s make them executable.
cd $APK_TOOLS
mkdir dex2jar
cd dex2jar
wget https://downloads.sourceforge.net/project/dex2jar/dex2jar-2.0.zip
unzip dex2jar-2.0.zip
chmod ugo+x dex2jar-2.0/*.sh
# luyten
cd $APK_TOOLS
mkdir luyten
cd luyten
wget https://github.com/deathmarine/Luyten/releases/download/v0.5.0/luyten-0.5.0.jar
# jdgui
cd $APK_TOOLS
mkdir jdgui
cd jdgui
wget https://github.com/java-decompiler/jd-gui/releases/download/v1.4.0/jd-gui-1.4.0.jar
[/code]

generating a keystore for apk signing

Before you can install a new apk file on an android device, it has to be signed. To sign, you need a signature. Because keystore generation is a one time thing, I’m including it here in the instructions. Let’s generate that now with the keytool command. My system has keytool without doing anything extra. I imagine adb added it for me.
It will ask for a password followed 6 questions. I just use the default of unknown. I’m not trying to put these apps on the playstore. I just want different versions on my device. Finally, it’ll ask for confirmation that everything’s correct:
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
[no]: yes
[code]
mkdir ${APK_TOOLS}/keystore
keytool -genkey -v -keystore ${APK_TOOLS}/keystore/my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
[/code]

building apktool yourself (optional)

In case you want to build apktool yourself from latest code. https://ibotpeaches.github.io/Apktool/install/
[code]
cd $APK_TOOLS
git clone https://github.com/iBotPeaches/Apktool.git
./gradlew build fatJar
# get wrapper script
wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
chmod ugo+x apktool
ln -s ./brut.apktool/apktool-cli/build/libs/apktool-cli.jar apktool.jar
[/code]
 

Developer mode and unknown apk sources

On your phone you’ll need to activate developer mode.
  • Settings->about device
  • Tap on ‘build number’ 7 times and a new menu will appear on the top
    menu.
  • Tell your phone it’s ok for a computer to try to talk to it via adb:
    Settings->developer options->Android debugging
  • Tell your phone it’s ok to install apks from unknown sources. You’ll need this later, after you’ve modified the game. You’ll be the unknown source
    Security -> unknown sources to on
At this point, connect your device to your computer with its usb cable. Let’s check that you can connect to it. When you run the next command, your phone will ask if it’s ok for your specific computer to connect. You’ll want to say yes and that it should remember.
[code]adb shell[/code]

Retreive, unpack and decompile

Again, I’m attempting to give bigger blocks of cut/pasteable commands. Here’s an overview of what we need to do:
  • use adb to find and retrieve the original app package (this needs to be it’s own step)
  • use apktool to unpackage it.
  • use dex2jar to… convert the dex containing the compiled into a jar file (still compiled)
  • use luyten or jdgui to get java sources.9

Some interesting things to look at

After you unpackage an apk with apktool, you’ll have a directory with something like an android project in it. Take a look around. In particular, you’ll find an assets directory. The assets directory contains all of the pictures and sound files of the game. Feel free to customize the app. Change character pictures. Put in some gangsta rap. Make sure the file names stay the same. When we rebuild from that area, any assets changes will come along for the ride.
In the instructions below, I use a environment variable to hold a base name for the stuff we’re processing. In this example it’s
[code]
export APK_NAME=firefightersFireRescue
[/code]

Getting the package location

This step is not really automatable unless you’ll trying to get everything.10
[code]adb shell pm list packages[/code]
Will give you a bunch of lines, including one like this:
[code]package:com.bestopgames.firefightersFireRescue[/code]
Now you want to find out where the apk for that app is on your device
[code]adb shell pm path com.bestopgames.firefightersFireRescue[/code]
gives me:
[code]package:/data/app/com.bestopgames.firefightersFireRescue-1/base.apk[/code]
Now that we know where it is, copy from the device to your local unix disk
[code]
cd <some path where you’ll be doing this experiment>
export APK_NAME=firefightersFireRescue
mkdir apk
cd apk
adb pull /data/app/com.bestopgames.firefightersFireRescue-1/base.apk ${APK_NAME}.apk
cd ..
[/code]

The other steps for unpackage to decompile

[code]
mkdir unpack
${APK_TOOLS}/Apktool/apktool d -s apk/${APK_NAME}.apk -o unpack/${APK_NAME}
${APK_TOOLS}/dex2jar/dex2jar-2.0/d2j-dex2jar.sh unpack/$APK_NAME/classes.dex -o dex2jar/${APK_NAME}.jar
java -jar ${APK_TOOLS}/luyten/luyten-0.5.0.jar dex2jar/firefightersFireRescue.jar
[/code]
Additional notes:
  • One note about the -s flag to apktool. This flag is also called the –no-src flag if you don’t give this flag, you won’t get the classes.dex file which you’ll need in the next step.
  • luyten doesn’t have a command line interface beyond telling it what jar to read. To save the javas you’ll need to use the gui.

Modify java, repackage, sign and upload.

In this section, I explain the steps I follow to get new java into an android app. Similar to the install section, I’ll have a cut/pasteable snippet at the end of this one.
Using both the luyten and jdgui decompilation tools I did not get a set of javas that just compiled. Trying to do this did not work:
[code]
javac `find . -name “*.java”
[/code]
In both cases, I get syntax errors, though not the same errors. Perhaps files from the two could be combined to get a clean full compile. For the purposes of what I’m showing here, you don’t need a clean compile. More on that later.

Turning off ads in the code

Here’s where things get really interesting (I think). Most games are pretty genericly written. They use a limited number of game engines. They use a limited number of in app advertising platforms. Poking around the firefighter game, I find two libraries in particular.
The first of these is cocos2dx: http://www.cocos2d-x.org/ Inside of it, I found the AISActivity class, which has the method “hideAd()”. That told me there’s a way to turn off ads with a switch. hmm. When I look some more, I find that the class ais.constants:Config.class has this:
[code]
package com.ais.constants;
public class Config {
public static void init() {
org.cocos2dx.lib.AISCommon.enableAdmob = true;
org.cocos2dx.lib.AISCommon.enableInterstitial = true;
org.cocos2dx.lib.AISCommon.enableInApp = false;
org.cocos2dx.lib.AISCommon.enableLocalNotification = false;
}
}
[/code]
Can it really be this easy? Now the trick is changing this file and recompiling. But how?
Again, if I do this:
[code]javac `find . -name “*.java”`[/code]
I get a ton of errors; recompiling everything would be a pain. Can I recompile just this one class?
[code]javac com/ais/constants/Config.java[/code]
Doing that, yields a bunch of android related errors. missing symbols. I tried a couple things. I downloaded the cocos2dx library, but there the problem is which version? I need to compile against something. Then I realized, I have a jar file!
So, here’s what you do. Change the two falses to trues and save it, along with any other files you want to change. You only need to compile modified files. For the commands below, place them under a “newjava” directory. It’s important to retain the intermediate paths to the files. In this example, that’s the com/ais/constants part.11
[code]
mkdir -p newjava/com/ais/con<code>tants/
cp <modified Config.java> newjava/com/ais/constants/
cd newjava
javac -cp ../dex2jar/${APK_NAME}.jar `find . -name “*java”`
jar uvf ../dex2jar/${APK_NAME}.jar `find . -name “*class”`
[/code]
You can use the following line to verify that you didn’t duplicate the file
[code]jar tf ../dex2jar/firefighter.jar | grep ‘/Config'[/code]
Here’s an important note. Unlike other compilers that I’ve worked with, java really pays attention to your directory structure. When running the javac and jar commands, it’s important to run the command from the directory that contains the com directory.

repackaging complete

Ok, now you have a new java file and I’ve showed how it can be easy to recompile it. There are several steps to get to something you can install.
apksigner has a nice feature that you can put your signing password into an environment varible instead of embedding into a script. In the commands below, I’m using SIGNPASS as the env var.
  • compile java to class files
  • add class files to jar
  • convert jar to dex
  • rebuild apk file
  • zipalign the apk file
  • sign the apk file
  • copy it to your device
[code]
export APK_NAME=firefightersFireRescue
export APK_TOOLS=../../tools/
# this assumes you’ve already dont the commented keytool step below.
# export SIGNPASS=YOUR_SIGNING_PASSWORD
cd newjava
javac -cp ../dex2jar/${APK_NAME}.jar `find . -name “*java”`
jar uvf ../dex2jar/${APK_NAME}.jar `find . -name “*java”`
cd ..
${APK_TOOLS}/dex2jar/dex2jar-2.0/d2j-jar2dex.sh -f dex2jar/${APK_NAME}.jar -o unpack/${APK_NAME}/classes.dex
mkdir rebuilt
${APK_TOOLS}/Apktool/apktool build unpack/${APK_NAME} -o rebuilt/${APK_NAME}_rebuilt.apk
zipalign -v -p 4 rebuilt/${APK_NAME}_rebuilt.apk rebuilt/${APK_NAME}_rebuilt_aligned.apk
${APK_TOOLS}/android_tools/sdks/build-tools/25.0.2/apksigner sign –ks-pass env:SIGNPASS –key-pass env:SIGNPASS –ks ${APK_TOOLS}/keystore/my-release-key.jks –out rebuilt/${APK_NAME}_rebuilt_signed.apk rebuilt/${APK_NAME}_rebuilt_aligned.apk
# now push to your device
adb push rebuilt/${APK_NAME}_rebuilt_signed.apk /storage/self/primary/Download
[/code]

Extra stuff that may be helpful

If you get an error like this one,
[code]
Exception in thread “main” brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec: [/tmp/brut_util_Jar_5394410189585563704.tmp, p, –forced-package-id, 127, –min-sdk-ver
[/code]
it’s because of a small comment in the apktool install instructions:
https://ibotpeaches.github.io/Apktool/install/

Make sure you have the 32bit libraries (ia32-libs) downloaded and installed by your linux package manager, if you are on a 64bit unix system.
(This helps provide support for the 32bit native binary aapt, which is required by apktool)

To fulfill this requirement, make sure you’ve done the 32 bit stuff in the install section above.
To solve errors like this one:
[code]
W: /tmp/brut_util_Jar_3065852416515877270.tmp: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
Exception in thread “main” brut.androlib.AndrolibException: brut.androlib.AndrolibException:
[/code]
You need this
[code]
sudo apt-get install zlib1g:i386
[/code]

Install it on your device

Now you just need to install it. Using the adb push command from your xterm, it’ll be in your downloads fold. On your phone, navigate to it in the file manager and click it. If you get a popup about unknown apks, you want to change the setting in settings->developer options->allow unknow sources. Make sure you copy over the signed apk otherwise you’ll get “an unknown error occurred”
[code]
adb push firefighter_noads_signed.apk /storage/self/primary/Download
[/code]

Please comment

This post took a lot of time to put together. It took more time than I really should have spent on it. The only way for me to justify it, is to know that others have benefited. If people respond positively, I’ll do other posts when I go down future rabbit holes.
Most Android Apps can easily be decompiled to remove the ads

  1. Let’s put aside the question of whether 3 year olds should be spending time on a tablet.

  2. and free! I would be happy to pay for them

  3. we paid to upgrade from free

  4. we paid to upgrade to “pro” version

  5. The same people also make a distasteful game (I think) Plastic Surgery Simulator Kids

  6. swiper no swiping..

  7. I’ll note that here in Germany, magazines and newspapers are not free to read online. You have to pay to get any of the content. NYTimes, Newsweek, The New Yorker give their full writings away. With the German equivalents, you get little more than short blurbs.

  8. I didn’t need to when developing my vocabulary app

  9. note that this is not truly the original, original java code. The variable names will be wrong. No comments. Still, the structure will be usable. This is not like getting C code from assembly. You’ll have if statements, for loops and all that.

  10. well, you could try to script it a little, but it’s not really worth the effort.

  11. Again, I have a bigger snippet later to do this and the other rebuild steps further down.

Losing our culture by losing our dialects

In a recent post, I talked about becoming fluent in another language. My father-in-law made a comment about it on Facebook observing that the presence of so many dialects made learning or at least understanding German difficult for him1. This triggered some thoughts that at first I thought would be a followup note, but I think there’s enough floating around in my head about it to justify a separate post.Dialects and accents. Most seem to hate them. I love em. Many see them as a sign of ignorance but I view it as richness of life. Since most of my friends are English speaking, I’ll start with my love of English variations. German has dialects that native German speakers can’t understand. In English, it’s a bit simpler. It’s mostly accents. I love accents.

English accents and dialects

More subtle is Frances McDormand’s performance in the movie Fargo. I loved her character.
Rosie Perez in Do The Right Thing (not safe for work)
https://youtube.com/watch?v=D_EtgFZCpfE
It’s not just women. For example Bob and Dough McKenzie
I could go on. I love it.

A Cultural Digression

Speaking of Ebonics, I have a story of my own. Many of my friends would agree that I’m the whitest black guy they know. 2 If nothing else, I “talk like a white guy”. Mostly, I just try to be myself, and I guess this is part of the reason that I don’t talk like the blacks on TV. Alright, I’m gonna digress into a side trail that isn’t really related to linguistics. Hopefully, I can tie it back into the topic. Beware that I’ll be generalizing heavily. Stereotypes exist for a reason but never forget that people are individual. My comments are based on the experiences of just one person, my own. Blacks, and black men in particular, have a well known stereotypical personality. The black community, like all communities, expects a fair amount of conformation. Below are some ways I relate to some of the common perceptions and expectations.
  • Into sports and basketball in particular. I don’t watch sports of any kind except the Olympics then they come around 3. I’ve never enjoyed playing 4 I’ve spent a lifetime of people taking one look at me any assuming I play. Ask me to play ice hockey and I’ll consider it though. List of blacks in the NHL
  • Lovers. I was very shy with girls as a teenager.  Later on, I found that Caucasian women, which I’ve generally preferred, perhaps because of my early years in Germany, either preferred white guys or preferred the more stereotypical black men. A girlfriend once related a comment made by one of her friends, “WHAT!? You’ve been dating a black guy all this time and didn’t tell me!?”. My personality doesn’t match the stereotype. Women seeking such a man should look elsewhere.
  • Church. The stereotypes you’ve seen about black churches ALL match the image or aspire to. The jokes comedians like Arsenio Hall make about black pastors are based on universal truth. I have never been to a black church that didn’t looking like something on TV.
    Although my dad and I didn’t attend church, the rest of my family is fairly religious. Sunday activities went from 8:30 to 2:30. Although I did attend church regularly for 8 months while living in Israel, I’ve always resisted organized religion. Church could and should be so strengthening, but most of the time, I’ve just seen it be oppressive, un-supportive, and hypocritical. So the culture of religion is something I’ve resisted.
  • The black church has its cultural influences. Folks go to church dressed to the nines. To take it further, if you don’t dress nice, that’s taken as an indicator that you’re not successful. I’ve always felt more comfortable in shorts and a tshirt.
  • Success as an image thing. I once went to visit a friend shortly after graduating college and starting at Intel. I flew down to LA and rented a car. Her mom said something to the effect of, “look at you, rentin cars and shit…” 5 I was a bit surprised by this comment. Just because you go into debt buying cars you can’t afford or do something as simple as renting a car does not success make.
  • “Acting white” was mocked though I usually took it as being teased for being smart and enjoying school. 6
While at Intel, for several years, I attended a leadership conference that Intel hosted to help improve representation within the company’s higher ranks. African American men and women from across the company traveled to Santa Clara for 3 or 4 days of workshops and networking. All of Intel’s grade 8+ were invited. Approximately 120 people. 7. The first two or three of those conferences left me energized but left out. I continually felt left out for not being black enough. That changed in the final two years when, finally, there was a critical mass of attendees that were at least as white acting as me. I finally felt like I fitted in.

Language as a source of comfort

Coming back to dialects. While I’ve never spoken black, it’s always been something that’s comforting to hear, especially now that I’m not in it. When I went to the conferences, as left out as I felt, it still felt like I was among my people. When I go to church, even though there’s so much I find distasteful, it’s familiar/soothing. 8. I love the variety of ways in which people express themselves. America still needs to make some progress when it comes to race/ethnicity/nationality. The recent election is a good demonstration of that. American and the world in general are still a bit oppressive of smaller groups. Communities should be coming together to support its members but too often they add to the oppression.

German Dialects

In Germany, a lot of the vocabulary can be different. People that grew up 100 miles apart can speak variations of German that are unintelligible to each other.
https://youtube.com/watch?v=3aX2HfOniv4
https://youtube.com/watch?v=NPJfnE5bO1Y

Dying Language

Speech like this is dying in Germany. Parents make an effort to speak only Hoch Deutsch with their kids. I asked my friend’s mom about this and doesn’t she think Germany is losing something. Here’s how she described it (paraphrasing from memory and translated):

In the early years of school, teachers ask students to write using their normal voice. It’s only later that they are taught grammar and standard German. In those early years, kids that speak dialect at home are at a disadvantage and some critical decisions are made in those times. Kids who are not yet able to speak standard German are labelled by their teachers as not suitable for Gymnasium9

Think of it like this. A smart kid grows up in “da hood”, where everyone speaks the local accent/dialect. That kid then is bussed to a school in a different neighborhood. To one of the “good” schools. He or she are accepted so the school can talk about diversity but many of the teachers then discourage them by assuming they’re stupid.
I went on to ask her what happens from here. Although I hear lots of locals speaking Hessisch, it’s only older folks; people in my parents’ generation. What happens when that generation passes?

Then Hessisch goes away

That makes me really sad. I hope you enjoyed this post as much as I enjoyed writing it.   Follow up
https://youtube.com/watch?v=A7HWXEF8rp4
For a long time, I thought of their accent in the same way I thought of German accents speaking English. Folks who have learned English but just aren’t able to say the sounds.

Well, in the case of Indians, this is incorrect thinking. People in Britain sound different when speaking English but few would say they are speaking incorrectly10. That’s just the local accent. Similarly, Indians in the US are speaking correct English. There are over a billion Indians who speak with an Indian accent and in India, it’s correct English. We don’t expect Brits to change their speech when they travel to the US, do we?
https://youtube.com/watch?v=pktGY3qk0LM

  1. After his time in the Navy, he ended up in Germany working for the Dept. of Defense

  2. even if I’m the only black guy they know. This is something that often surprises me. How is it possible that so many people know no black people?

  3. mostly because there’s such a variety that we don’t normally have

  4. a notable exception is D league, the lowest league, intramural sports in college. That was really fun

  5. I’ll note that this woman was very intelligent. One of my regrets in life is that I didn’t take the time to travel to LA for her funeral.

  6. to be fair, all cultures (except maybe Asian and Jewish ones) don’t encourage intelligence. Asian and Jewish cultures are oppressive in their own ways. What a wonderful world we live in. 😉

  7. that’s a small number given that Intel employed probably 50k people in the US. I once sat next to a higher manager in my dept on the Intel shuttle. He was trying to get a raise for everyone via a “market adjustment” and was working on a presentation for that. One of the foils I saw indicated that about a third of the dept were 8+ at the time. I spent about half of my career as a 9. I could tell that some of the managers around me didn’t think I deserved that. Conversely, I want to believe that many/most of my peers thought I did and perhaps should have been a 10/PE. Personally, I believe that I was worth every penny Intel paid me. It may not have been true in one or two of those years, but in those cases, my main deficiency was that I should have transferred somewhere else with less dysfunctional leadership.

  8. My church time in Israel was at a church that, while not black, could be described as charismatic. It’s the kind with lively, non-organ, music. Hallelujahs, many hands in the air… The stuff I grew up with. I tried the other Christian church in Haifa with my friend Teresa once and we both noted that it felt dead. . It’s the kind with lively, non-organ, music. Hallelujahs, many hands in the air… The stuff I grew up with. I tried the other Christian church in Haifa with my friend Teresa once and we both noted that it felt dead.

  9. basically college prep

  10. pompous, perhaps

My new Kicad blog

https://kicad.mmccoo.com
Over the years, I’ve come to love Free and Open Source Software (FOSS). I’ve been bitten so many times when a company loses interest in a product. If it’s closed source, I might as well throw it away.1
During my years at Intel, I appreciated the openness of the codebase. I took it for granted that if I couldn’t get a program to work, I had the option of looking at the source code. I once considered trying to put some of my perl language utilities on CPAN. Talking to the guy who could help me was really depressing. The short summary: don’t bother trying. 2 It was weird given how incredibly open things are inside the company.
When I first headed to MIT, it was my intention to do electrical engineering. Once I starting taking classes, I found I had much more aptitude for programming. My programs, even the complex ones, just worked. My electrical circuits… constant stuggle. Still, it’s something I’ve always been drawn to.
Recently, I’ve wanted to goof around with LED grid arrays. Something like this:
https://youtube.com/watch?v=guppB4cK3oU%3Flist%3DPL0JWuCHXfJ2zXVRqFRFVq-lNt_xtCYMjx

The thing is that there’s a lot of tedious circuit wiring involved (beyond wiring the LEDs themselves). Why not design a circuit board? Getting boards made is cheap and I’ve wanted to try surface mount soldering.
I’d used CadSoft’s Eagle editor 3 before but wanted to use FOSS. Kicad is becoming a leading PCB suite among hobbyists. CERN uses it
But, in spite of its popularity, it’s missing a lot of features.
Since I like programming, I have experience in EDA, and there are some features I want, I dove right in. The scripting interface was the first thing I looked for and it’s not at all documented, even by internal Intel standards.
So my blog is a set of tutorials on how to use the scripting language in Kicad’s layout editor.
If you have no interest in PCB, the blog won’t be interesting, except, perhaps this post on why scripting language support is important.
My new Kicad blog

  1. An example is the wireless music bridge once sold by Linksys. I had two of them to stream music from my computer to my stereo. This was before streaming was something anyone did. The drivers always sucked but I tolerated it since it was the only option available. Somewhere along the line I needed to reinstall my computer. When I went to the Linksys website… no driver. Even when using the web chat. no driver. I wasn’t asking for an updated driver. I wanted the original. Sorry, we don’t have the driver.

  2. the main issue is that Intel is worried about releasing someone else’s code. Intel is very sensitive to the perception that they’re taking advantage of the little guy. Intel insists on paying someone for free, open source, GPL stuff like emacs, gcc, csh, grep…

  3. bought by Autodesk