Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How the Command-Line Can Give You Superpowers

Eric Fung
August 16, 2018

How the Command-Line Can Give You Superpowers

I want to show you how the command line can simplify, and even automate some of the things Android developers need to do. Learning how to use command line tools will give you more ways to get your work done.

Using macOS as the platform, I’ll demonstrate real-world examples of how you can generate Java and Kotlin code, edit visual resources, speed up manual testing, enhance pull requests, manipulate JSON files, and more. All from a terminal, without using a GUI!

Presented at Android Summit, 2018-08-16.

Note that the slides don't include the videos/animations.

Video Recording: https://www.youtube.com/watch?v=95s4UM5lezk

Eric Fung

August 16, 2018
Tweet

More Decks by Eric Fung

Other Decks in Programming

Transcript

  1. How The Command-Line Can Give You Superpowers Eric Fung •

    @gnufmuffin Android Summit • 2018-08-16
  2. Superpowers, eh? — Learn to type less — Teleport to

    your destination — Search haystacks and find needles — Rapidly integrate with remote APIs — Transmogrify bits of data — Control devices telekinetically How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  3. Why should I care? — Gets you results more quickly

    — Gives you more ways to solve problems — Makes you more versatile How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  4. Structure — The basics — Typing less — Working with

    Finder — Navigation — Searching — I/O — Web — JSON — Image manipulation — Deployment and testing — Code generation How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  5. Terminal: iTerm2 — Extensive features and customization — Favorites: —

    ⌘-click to open URLs and files — Highlights all search results — ⌘-; autocompletes from anything on screen How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  6. Shell: bash — macOS default shell — Widely used →

    lots of support — May want to install newer version How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  7. Package manager: Homebrew — All kinds of software (e.g. ports

    of Linux tools) — Over 4000+ packages — Very easy to use How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  8. Completion — Built-in to bash — Context sensitive — Completes

    command names and option names — Completes option values too! How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  9. adb completion — install — completes with APKs in local

    directory — uninstall — completes with installed application IDs — global -s option — completes with serial numbers — shell pm — completes with subcommands — pull — completes from device filesystem How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  10. Demo: adb install completion How The Command-Line Can Give You

    Superpowers • Eric Fung • Android Summit 2018
  11. Demo: adb uninstall completion How The Command-Line Can Give You

    Superpowers • Eric Fung • Android Summit 2018
  12. Gradle completion — Knows properties, e.g. - Dorg.gradle.parallel — Fast,

    due to task cache — Note: Implicit tasks not completed by default How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  13. From shell to Finder — open <thing> — Equivalent to

    double-clicking on <thing> — open . — Opens Finder with current directory How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  14. open -a <app> <file> — Open file with a specific

    application — Useful if file does not have default handler — Tip: define a function or alias asopen() { open -a "/Applications/Android Studio.app" "$1" } How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  15. From Finder to shell — Drag-and-drop file(s) onto Terminal —

    Pastes their filename(s), space-separated How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  16. Drag files to shell → paste filename How The Command-Line

    Can Give You Superpowers • Eric Fung • Android Summit 2018
  17. cd 101 — cd app/src/main/res/layout — cd ../../java — Go

    to a subdirectory — cd - — Go to previous directory How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  18. autojump — Provide fast access to directories further away —

    Selects directories based on usage — Caveat: must be visited first How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  19. autojump — j name — Go to most-used directory containing

    name — jc name — Go to a subdirectory containing name — j name <Tab> — Offers choices when there are multiple matches How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  20. The Silver Searcher — Much faster — Supports grep options

    — Knows about file types — Respects revision control ignores — Sensible defaults How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  21. Search Android documentation offline ag <term> $ANDROID_SDK/docs How The Command-Line

    Can Give You Superpowers • Eric Fung • Android Summit 2018
  22. I/O 101 — Streams: stdin and stdout — Redirection: >

    and < — Pipelines: | How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  23. Working with Clipboard — pbcopy (⌘-C for the shell) —

    Reads from stdin, copies to clipboard — pbpaste (⌘-V for the shell) — Copies contents of clipboard, writes to stdout How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  24. curl — Comprehensive client for working with Internet protocol transfers

    — "the number of features will make your head spin!" — Supports HTTP, SMTP, IMAP, RTSP, and lots more — Designed to be unattended How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  25. Debugging endpoints: --include $ curl 'https://search.icons8.com/api/iconsets/v4/search' --include HTTP/2 200 server:

    keycdn-engine date: Thu, 09 Aug 2018 19:39:52 GMT content-type: application/json; charset=utf-8 content-length: 96 cache-control: max-age=604800 expires: Thu, 16 Aug 2018 19:39:52 GMT x-cache: HIT x-shield: active x-edge-location: usch access-control-allow-origin: * accept-ranges: bytes How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  26. Displaying fetched images $ curl --header "Authorization: ${KEY}" \ https://img.icons8.com/color/256/puppy

    | imgcat — Pipes response through iTerm2's imgcat script How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  27. Debugging Firebase Cloud Messaging — Typically, app server initiates push

    — Console can only send notification messages — Can simulate server from command-line — More details in the Firebase docs How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  28. Sending a push notification $ curl \ --header "Authorization: key=${FIREBASE_LEGACY_SERVER_KEY"

    \ --header "Content-Type: application/json" \ --data payload.json \ https://fcm.googleapis.com/fcm/send — Legacy server key avoids OAuth complexity How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  29. gron — Turns JSON into line-oriented data — Then, search

    with tools like ag — Identify individual array elements How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  30. Slice and dice superpower How The Command-Line Can Give You

    Superpowers • Eric Fung • Android Summit 2018
  31. jq — Powerful, flexible processor — Concise syntax — Transform

    data you have, to data you want How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  32. Extract values from array of objects $ jq -r '.photos.photo

    | .[] | .title' flickr.json AJH-20180814-467-Edit.jpg East Garston series: quintessential English countryside IMG_20180723_215912_323 P1030365.jpg Frankrijk 2018 Shirts on Sale (+6 03 6143 5225)Contact Us 03 6143 5225 https://t.co/dBTffHWW99 Tratamiento Alternativo Para El Colon Irritable How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  33. Filter elements by predicate $ jq -r '[.photos.photo |.[] |select(.id

    |tonumber <= 43036557531)]' \ flickr.json [ { "id": "29099232337", "owner": "138111370@N03", "server": "1772", "farm": 2, "title": "AJH-20180814-467-Edit.jpg" … }, … ] How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  34. Spot the difference superpower How The Command-Line Can Give You

    Superpowers • Eric Fung • Android Summit 2018
  35. ImageMagick — Suite of command-line utilities — Create, edit, compose,

    or convert bitmaps — Read/write 200 image formats — Handles really large images How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  36. bash function using IM's montage side_by_side() { montage -background lightgray

    -pointsize 60 \ -label '%t' \ $* \ -tile x1 -geometry '+30+30' \ combined.png } — $* is all the function's arguments — -label '%t' is IM syntax defining label from each argument's base filename How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  37. Usage $ side_by_side before.png after.png How The Command-Line Can Give

    You Superpowers • Eric Fung • Android Summit 2018
  38. Example: Crop multiple density bitmaps How The Command-Line Can Give

    You Superpowers • Eric Fung • Android Summit 2018
  39. bash loop using IM's convert $ for r in m

    h xh xxh xxxh; do \ convert -gravity SouthWest \ -crop 100%x40%+0+0 \ res/drawable-${r}dpi/background.jpg \ res/drawable-${r}dpi/background_out.jpg; \ done — -gravity defines origin — Keep 40% of image in vertical direction How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  40. Example: compare images — Shrink PNGs with pngcrush — Optimize

    SVGs with svgo How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  41. IM's compare $ compare butterfly.png optimized.png \ -compose Src difference.png

    How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  42. Installing APKs wirelessly — APKs can be installed over WiFi

    (see Google's adb over WiFi) — Process seems cumbersome — Some devices block USB loading (unless you sign up)! How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  43. qr-filetransfer — Starts a local webserver, with randomized URL hosting

    your file — Generates QR code in terminal that points to that URL How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  44. Automating device input — adb shell input text <text> —

    Sends keycodes to device — adb shell input tap <x> <y> — Sends touch events to device How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  45. Example: log in to Slack workspace function slack_workspace_login() { adb

    shell input text $1 # workspace adb shell input tap 400 1000 # next sleep 1 adb shell input text $2 # email sleep 1 adb shell input tap 400 1000 # next sleep 1 adb shell input text $3 # password } — Naive, but good enough usually How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  46. quicktype: automatic data models — Web app and command-line tool

    to generate models from JSON — Rapidly integrate with an unfamiliar API lacking an SDK — Get sample JSON with curl, then paste into website How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  47. Scripting: write code to write code — Use high-level language,

    e.g. Python, Ruby — Turn data into code via templates — e.g. CSV to Kotlin enum values — e.g. CSV to bulk Google IAP SKUs How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  48. Summary — Basic command-line setup — How to make the

    command-line easier to use — Many specialized tools to help you get stuff done — Development — Design — Debugging How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  49. End — Contact [email protected] • @gnufmuffin — Work shopify.com/careers —

    Blog code.gnufmuffin.com — Slides speakerdeck.com/efung How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  50. Appendix: How to install (1/2) Name What it's for How

    to get it1 iTerm2 full-featured terminal https://iterm2.com/ Homebrew package manager https://brew.sh/ bash completion bash completions for macOS builtins ! bash-completion adb completion bash completions for adb envsetup.sh + adb.bash Gradle completion bash completions for Gradle tasks ! gradle-completion autojump navigate directories faster ! autojump The Silver Searcher (ag) fast, intelligent code searcher ! the_silver_searcher curl transfer data with URLs ! curl everything curl book 1 ! denotes Homebrew package name How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018
  51. Appendix: How to install (2/2) Name What it's for How

    to get it1 gron make JSON line-oriented and searchable ! gron imgcat display inline bitmaps in iTerm2 imgcat jq transform and query JSON ! jq jq manual jq cookbook ImageMagick utilities for image manipulation ! imagemagick usage examples qr-filetransfer transfer local files to device via QR codes github.com/claudiodangelis/qr-filetransfer quicktype generate data classes from JSON app.quicktype.io ! quicktype 1 ! denotes Homebrew package name How The Command-Line Can Give You Superpowers • Eric Fung • Android Summit 2018