Small hacks
A collection of small, fast-forward recipes for achieving common common Dev-Ops goals and simplifying daily work with Linux, Bash, Pandoc and Nginx.
Deep work
Qutebrowser
Configuration file of ~/.config/qutebrowser/config.py
:
c.content.host_blocking.lists = [
'https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/social/hosts'
]
config.bind(',h', 'config-cycle -t -p content.host_blocking.enabled')
c.url.start_pages = ["about:blank"]
c.url.searchengines = {
"DEFAULT": "https://google.com/search?q={}"
}
Firefox
Clean browsing history and cache
Press: [Ctrl]
+[Shift]
+[Del]
.
Block obtrusive content
To block hot network questions, go to: uBlock Origin -> Open the dashboard -> Add a rule ###hot-network-questions
-> click "Apply changes".
More useful uBlock Origin filters:
! StackExchange Network
###hot-network-questions
! 4/27/2018, 1:08:35 PM https://medium.com/
! Medium Corporation subscription nag footer
##.js-stickyFooter
! 6/21/2018, 10:55:40 AM https://www.youtube.com/
! YouTube video related content
www.youtube.com###related
! 6/26/2018, 11:39:21 AM https://www.youtube.com/
! YouTube welcome page recommended rubbish
www.youtube.com###dismissable
You might find a network-wide ad-blocker useful. In such a case, see Why You Need a Network-Wide Ad-Blocker for the Pi-hole package.
Browsing
Browse tabs as a tree: https://github.com/piroor/treestyletab
.
- To toggle the sidebar, press
[F1]
.
about:config
settings for privacy and performance:
Fetch Web information through your terminal
Wikipedia
Search Wikipedia from terminal: wikit <query>
; install with npm install -g wikit
.
Google quickly from command line
sudo add-apt-repository ppa:twodopeshaggy/jarun
sudo apt-get update
sudo apt-get install googler
$ googler <query>
Check your external IP
BLAZINGLY FAST, directly from your terminal emulator. We are ultra-grateful to Tomasz "Sztylet" for every minute we saved thanks to this.
$ curl ifconfig.co
Check weather via console
curl wttr.in/warsaw
Instant URLs
- Google Feeling Lucky:
http://google.com/search?btnI=1&q=<query>
- Encyclopedia Britannica:
britannica.com/topic/<query>
https://www.britannica.com/search?query=<query>
Web browsers
Start in a private window
- Firefox:
firefox --private-window
- Opera:
opera --private
Smartphone SSH access
Connect to your phone via terminal with Termux:
ssh any_user_name@phone_ip -p 8022
Documentation
Sources of graphics
Repositories of free-to-use-commercially branding content
Icons
Open-source icons:
-
TTF-formatted: Many SIL-licensed: http://fontello.com/
-
More SIL-licensed: https://fontawesome.com/ (couldn't find how to use this)
Public-domain icons:
- https://thenounproject.com/ (Registration required)
- https://publicdomainvectors.org/ (no registration required, fast)
Custom logos in seconds:
Photographs
- Unsplash.com
Drawing schematics
- Diagrams.net (formerly "Draw.io"),
- GraphViz
Retain and manage knowledge
I developed my own system where I’d have a text file on my desktop with a file name of let’s say 2016-12 for December 2016. Then I would jot down everything worth saving in that file. (...) It’s productive because there’s no complex application to get situated with. You open up a text editor, jot down your note and save it. That’s it. There’s no thought process required for figuring out tags or context.
-- Nick Janetakis, Plain Text and Google keep Is a Killer Combo for Notes and Organization
Text editing
Markdown
See atom.io
, with a plug-in: document-outline
.
Or vim
with plug-in Voom
.
Or GhostWriter which even played a linked animated GIF correctly.
To convert from OneNote to Markdown you can follow this tip.
Vim
Save with sudo
:w !sudo tee %
Join lines
To remove unneeded newlines in Vim, press J
or gJ
(to avoid adding spaces instead). To remove only from a part of the text, select the text with v
or V
and then press J
or gJ
respectively.
source: here
If afterwards multiple consecutive spaces occur, you can use the RegEx pattern of s/ \{2,}/ /g
to remove them, possibly selecting a specific block of text to operate on beforehand. This tip came from mikerobi.
Insert 8 spaces quickly
<C-o>:norm 8i <CR>
<C-o>
stands for [Control]+[o] - commanding without leaving insert mode.
Retab a file
:set expandtab
:retab
To change the number of spaces substituted for a tab, issue: :set shiftwidth=<number>
with <number>
of 4 for example.
Use 4 spaces for TAB in ViM
Put the below into .vimrc
.
filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab
To quickly type the above to a file with cat
, use cat >> ~/.vimrc << EOF
.
.vimrc collected personal configuration
filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab
" Assign Paste Mode toggle to [F3].
set pastetoggle=<F3>
" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif
Managing references
Track references locally with Zotero: To install Zotero, you can use the instructions herein.
Preview Markdown in console
Isssue: pip install mdv --user
, mdv README.md
.
Converting to PDF
Pass your defaults.yaml
file containing your defaults as the last argument like so:
pandoc -f markdown -s your-input-file.md defaults.yaml
Metadata definitions seen first are kept and left unchanged, even if conflicting data is parsed at a later point.
Source: issues
When a value is set multiple times in the same document, the
earlier one takes priority.
Record your desktop
Byzantz looks promising, mentioned in this answer.
Install:
sudo add-apt-repository ppa:fossfreedom/byzanz
sudo apt-get update && sudo apt-get install byzanz
Run:
# Install Cairo (One of those may suffice):
sudo apt install libcairo2-dev libcairo2-doc
libcairomm-dev libcairo2
# Install GTK+ 3.0:
sudo apt-get install build-essential libgtk-3-dev
# Run install:
./autogen.sh
Viewing EPUB in Linux
Using fbreader
for that - faster and lighter than popular alternatives like Okular or Calibre. May be more buggy, some warn.
And it is buggy - scrollbar behavior is inconsistent. The icons are bad style. But the e-book is displayed correctly.
Publishing documentation
See ReadTheDocs.io.
Here is a step by step guide on how to install Read the Docs. It will get you to a point of having a local running instance.
-- Installing ReadTheDocs locally, Installation
Linux
Development
Testing
To test software agains Bash I/O, you can use bats.
Consult the BATS file format syntax: man 7 bats
. In general, chapter 7 of the Man pages includes "macro packages and conventions".
Test scenarios
Test HTTP service availability
To test connectivity with a container, call the following script:
#!/usr/bin/env bash
# Test if visiting the my.service.com page returns a `success` HTTP response code.
printf "Is the GitLab server accessible via HTTPS?: "
res=`curl -w "%{http_code}\n" "https://my.service.com" -s -o /dev/null -L`;
if [ "$res" -eq 200 ] ; then echo "true"; else echo "false"; fi
Packaging
Cleanly install a Linux package you prepared: If your package has no make uninstall
target, issue sudo checkinstall
.
Ensure root privileges before make install:
install:
@bash -c "if [[ $EUID -ne 0 ]] ; then \
echo \"This script must be run as root.\" ; \
exit 1; \
else \
cp -r . /usr/local/my_package ; \
fi"
Version tracking with Git
Track an existing directory with GitLab online:
cd existing_folder
git init
git remote add origin <repository_url>
git add .
git commit -m "Initial commit"
git push -u origin master
Remove a remote Git branch
git push origin --delete <branch_name>
Operations
List users on the system: cut -d: -f1 /etc/passwd
.
Synchronize directories: To make the destination a strict, mirror copy of the source, deleting any extra files it may have: rsync -av --delete /home/joe/from-dir /media/backup/to-dir
.
Install a package from source
The standard, UNIX-wide universal way to install a TGZ package after [1]:
./configure
,make
,make install
.
If you need to deploy the package over SSH, deployr might be helpful.
Create a clean testing environment
Quickly set-up a clean Linux environment in a container.
docker pull ubuntu:xenial
ordocker pull amd64/node
,
docker run --name testing_ground --rm -it ubuntu:xenial bash
for a clean Ubuntu, ordocker run --name testing_ground --rm -it amd64/node bash
for a clean NodeJS container,
- Now we can execute commands inside the container. WARNING: All session data will be lost when upon exiting the container.
Copy file contents to clipboard from the terminal
xclip <file_name> -selection clipboard
Save clipboard contents as a file:
xclip -selection clipboard -o > <file_name>
Print directory content as a list of configuration values
grep "" <directory> -s
Help
Try apropos
first, then man
or info
[2].
Zeal Docs is a good program to have on hand in case offline operation becomes necessary for a while.
Examples of some Linux commands: curl cheat.sh
[3].
If you feel you have to refer to online resources to get help, you can make that experience less engaging by using qutebrowser
. It allows you to browse the Web using solely Vim-style keyboard controls.
One of the things that can really make or break a project for me is how its developers behave towards the users. The developer of this project is a really upstanding, responsive, kind human being. I think his project deserves all the attention it can get.
I have used qutebrowser as my primary browser on Linux for years. I have no complaints. In fact, qutebrowser runs smoothly on some of my older machines where Firefox struggles to run.
-- YC News
Replace a configuration line
Replace a line setting with another: awk '/line_string_to_seek_to/{gsub(/previous_value/, "new_value")};{print}' file_name
. For example, to substitute my.satpack.eu
for localhost
, we do the following:
awk '/ws = new WebSocket/{gsub(/8443/, "443")gsub(/localhost/, "my.satpack.eu")};{print}' private/main.js > private/main.js.new && mv private/main.js.new private/main.js
Nginx: redirect subdomain to a port quickly
server {
listen 80; # Port to redirect
server_name docker.giss.pl; # Queried address
location / {
proxy_pass https://localhost:5001; # Address to point to
}
}
See here.
Edit the file /etc/nginx/sites-enabled/default
.
Upgrade your shell from Bash to Z-Shell
Install zsh. Then install Oh-My-Zsh from ohmyz.sh
. Then, import settings from Bash to Zsh by moving your common settings to the file .profile
and including them as follows from here:
- File
.bashrc
:source ~/.profile
, - File
.zshrc
:[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'
.
Install a package in Ubuntu
Use apt instead of apt-get: Apt is a modern overlay of apt-get and apt-cache. See It's FOSS.
Run a command in the background
screen -S <mnemonic> <command>
The mnemonic helps in the process of retrieving the particular screen.
Check version of package in Ubuntu
apt list <package_name>
Blank the screen
#!/bin/bash
sleep 1; xset dpms force off
Then you can set a shortcut in Gnome3 application "keyboard" (gnome-control-center keyboard) to run that script when you push [CTRL+ALT+Q].
List groups in the system
cut -d: -f1 /etc/group
Add user to group sudo
# >
usermod -a -G sudo <user>
Synchronize two directories
rsync -rtvu --delete source_folder/ destination_folder/
Explained here.
Do a quick desktop calculation
gnome-calculator -s "expression"
Generate a random password
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo
[4]
Bash scripting
Basic script architecture
References:
#!/usr/bin/env bash
log() {
mkdir log
exec 1>>log/output.log
exec 2>>log/errors.log
}
location=$(readlink -f "$0")
install_dir=$(readlink -f $(dirname $location))
# set -o xtrace
do_stuff() {
echo Doing stuff...
}
list_functions() {
# List all functions found in this file.
# Based on the ideas of Glenn Jackman,
# https://stackoverflow.com
# /a/5868245
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
ensure_root() {
# Request root privileges.
if [[ $EUID -ne 0 ]] ; then
echo "This script must be run as root." ;
exit 1;
else
proceed
fi
}
show_help() {
printf "Usage: $0 <function_to_call>\n"
echo "= Available functions:"
list_functions
}
main() {
show_help
}
check_command() {
# Verify that the command exists and is a function,
# Credit: that other guy, Stack Overflow
# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
# call arguments verbatim
"$@"
else
# Show a helpful error
echo "'$1' is not a known function name" >&2
exit 1
fi
}
call_directly() {
if [[ $# -gt 0 ]] ; then
"$@"
else
return 1
fi
}
(call_directly "$@" && exit 0) || main "$@"
Enable command tab completion
To enable tab-completion, refer to Kyle Bak:
# Bash
complete -F <completion_function> notes
# Zsh
compctl -K <completion_function> notes
Run function in a sub-shell by default
To spawn the function in a subshell rather than execute it in the current environment, replace the usual code-block braces with normal braces [5]:
Turning this:
function name () {
# Code here
}
into this:
function name () (
# Code here
)
Change a string in a file
Edit file in place - filter: sed -i 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' filename
Redirect stdout to a file
do_something &> some_file
Design complex text pipelines in a fast feedback loop
up is the Ultimate Plumber, a tool for writing Linux pipes in a terminal-based UI interactively, with instant live preview of command results.
-- up
Find duplicate files
Tool named duff
reports on duplicate files, via a SHA1 hash of the contents, recursively. For alternatives, see [6].
Change host name
- Edit
/etc/hostname
file to match needs, - Run
/etc/init.d/hostname.sh start
to apply change to the running system. - Edit
/etc/hosts
to match your new host name (optional, for cleanliness).
Internet services
Set up an external domain name for a host: NoIP.
Review listening interfaces
netstat -a
/ nmap localhost
Or:
sudo lsof -i
sudo netstat -lptu
sudo netstat -tulpn
Find live hosts on your subnet
nmap -sP 192.168.1.1/24
Edit the SSH welcome message
Edit the file /etc/motd
. More on this topic is here.
Change the message into a dynamic one: read in the above article under the section "How to then?".
Allow a port in Ubuntu
For example, for port 444 issue: ufw allow 444/tcp
.
Warning: UFW may not run instead, but in series with iptables. To configure iptables, follow simple instructions here.
To save the rules, issue sudo service iptables save
.
Resume file download
wget -c <url> --output-document=<partially_downloaded_file_name>
Download a large file over a freezing connection
wget -c --tries=0 --read-timeout=4 [URL]
Docker
Review running containers
Docker built-in method
docker ps -a
view is unclear due to long lines that do not wrap in a uniform manner.
Vertical listing
To display all containers vertically, call the following script:
#!/usr/bin/env bash
export FORMAT="ID\t{{.ID}}\nNAME\t{{.Names}}\nIMAGE\t{{.Image}}\nPORTS\t{{.Ports}}\nCOMMAND\t{{.Command}}\nCREATED\t{{.CreatedAt}}\nSTATUS\t{{.Status}}\n"
docker ps --format="$FORMAT"
Third-party terminal-based dashboard
An alternative is the dry monitoring tool.
Clean up
Remove all stopped Docker containers: docker ps -a -q | xargs docker rm -v
.
Remove all unlabeled images not attach to any running container: docker images -f dangling=true -q | xargs docker rmi
.
-- David Maze
JavaScript
Preview JSON data
View online
JSON Editor Online displays your JSON side-by-side in a readable, hierarchical format.
View in terminal
Pipe your JSON data into the command python -m jsontool
.
Tweak code performance
Tweak software performance using "wormholes": see DZone
Authenticate clients to a server
A less-well-known but nevertheless useful feature of SSL is that it can be used to authenticate clients to a server, as well as simply providing an encrypted communication channel.
-- Laurence Withers
Examples of how a client can be authenticated to a server include:
- SQRL by Gibson Research Corporation,
- SSL, see
Serve file content via HTTP
Example worked from here.
Idea is to load a JSON and reload it every n seconds, realized here.
Update the file periodically
Periodically update file:
dmesg | tail | sudo tee test.html
Repeat a command automatically: watch -n <seconds> <command>
.
Refresh log file every 3 seconds:
watch -n 3 'dmesg | tail | sudo tee test.html'
Code to run to demo:
sudo watch -n 1 ./rep.sh
Fair use
ISC License
Licencja ISC – licencja wolnego oprogramowania autorstwa Internet Systems Consortium. Zezwala na korzystanie z programu i jego kodu źródłowego w dowolnym celu, pod warunkiem zachowania informacji o autorze wraz z treścią licencji. Ponadto autor nie udziela żadnych gwarancji związanych z programem. Tym samym licencja ISC odpowiada warunkom korzystania na jakie zezwalają licencje 2-klauzulowa BSD i MIT, jest jednak od nich krótsza i napisana prostszym językiem, z pominięciem słownictwa uznanego przez Konwencję berneńską za zbędne.
Z licencji ISC korzysta między innymi projekt OpenBSD[1].
See Wikipedia
License content:
Copyright © 2004-2013 by Internet Systems Consortium, Inc. (“ISC”)
Copyright © 1995-2003 by Internet Software Consortium
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.THE SOFTWARE IS PROVIDED “AS IS” AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Communication
Find a person's e-mail
If they have a GitHub repository, you can try the link below, replacing xxxxxx
with their username: https://api.github.com/users/xxxxxxx/events/public
.
In the received response, search for the string "email".
The tip comes from here.
Send an e-mail message through your terminal
- Place your e-mail configuration in the file
~/.mailrc
, - Send your e-mail using the command:
mail <addressee> < <message_file.eml>
.
Pocket software engineer's lexicon
- nonce - (ang.) identyfikator jednorazowy, (przymiotnik) okazjonalizm
Satellite communication
satbeams.com - a catalog of satellites
LNB - Low noise block
Natural constraints
Euler's identity
"The most beautiful equation in mathematics":
$$e^{i*pi} + 1 = 0$$
"like a Shakespearean sonnet that captures the very essence of love, or a painting that brings out the beauty of the human form that is far more than just skin deep, Euler's equation reaches down into the very depths of existence
-- Keith Devlin, Stanford, see Wikipedia
The Dirac Delta equation
$$(i * delta - m) * psi = 0$$
Mind
Retype instead of copy-pasting
I was able to quickly remember what I retyped before. Speeded up my work.
Develop better as a programmer
Take decisions fast and assume responsibility for yourself, your team and your client
Stop worrying about future decisions and dive in.
Make practice fun by treating new skills like toys.
Find time to code by only making tiny commitments the way you would with sites like Facebook, YouTube, or Wikipedia.
Slow down, take smaller steps, and you’ll learn faster.
More specifically:
- Don’t Let Future Decisions Stop You from Progressing Now,
- Don’t Let Confidence Trick You into Forgetting Things,
- Approach Practice with the Right Mindset,
- Find Time to Code Using the Facebook Trick,
- Think Slower and You’ll Learn Faster,
- Write Complex Code in Plain Language First.
-- Yaphi Berhanu, Six Simple Mind Tricks to Help You Learn JavaScript Faster
Ignitory question
Am I inventing things to do to avoid the important?
-- Tim Ferriss, "The 4-Hour Work Week"
Specify clear goals
Remember the SMART rule - a goal should basically be:
- Specific,
- Measurable,
- Ambitious,
- Relevant, and
- Time-bound.
Make growth a daily routine
- Start the day with 2-3 hours of deep work (see "Deep Work" by Cal Newport),
- Postpone checking your e-mail until near the end of the day.
- Conclude the day with a review of the day (see "Deep Work") and a quick skim through the headlines on the Hacker News (optional; see "4-Hour Work Week" - news are not at all necessary to thrive, let alone to survive).
Pragmatic Programmer's Highlights
- Care About Your Craft Why spend your life developing software unless you care about doing it well?,
- Think! About Your Work Turn off the autopilot and take control. Constantly critique and appraise your work.,
- Provide Options, Don't Make Lame Excuses Instead of excuses, provide options. Don't say it can't be done; explain what can be done.,
- Don't Live with Broken Windows Fix bad designs, wrong decisions, and poor code when you see them.,
- Be a Catalyst for Change You can't force change on people. Instead, show them how the future might be and help them participate in creating it.,
- Remember the Big Picture Don't get so engrossed in the details that you forget to check what's happening around you.,
- Make Quality a Requirements Issue Involve your users in determining the project's real quality requirements.,
- Invest Regularly in Your Knowledge Portfolio Make learning a habit.,
- Critically Analyze What You Read and Hear Don't be swayed by vendors, media hype, or dogma. Analyze information in terms of you and your project.,
- It's Both What You Say and the Way You Say It There's no point in having great ideas if you don't communicate them effectively.,
- DRY – Don't Repeat Yourself Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.,
- Make It Easy to Reuse If it's easy to reuse, people will. Create an environment that supports reuse.
- Eliminate Effects Between Unrelated Things Design components that are self-contained. independent, and have a single, well-defined purpose.
- There Are No Final Decisions No decision is cast in stone. Instead, consider each as being written in the sand at the beach, and plan for change.
- Use Tracer Bullets to Find the Target Tracer bullets let you home in on your target by trying things and seeing how close they land.
- Prototype to Learn Prototyping is a learning experience. Its value lies not in the code you produce, but in the lessons you learn.
- Program Close to the Problem Domain Design and code in your user's language.
- Estimate to Avoid Surprises Estimate before you start. You'll spot potential problems up front.
- Iterate the Schedule with the Code Use experience you gain as you implement to refine the project time scales.
- Keep Knowledge in Plain Text Plain text won't become obsolete. It helps leverage your work and simplifies debugging and testing.
- Use the Power of Command Shells Use the shell when graphical user interfaces don't cut it.
- Use a Single Editor Well The editor should be an extension of your hand; make sure your editor is configurable, extensible, and programmable.
- Always Use Source Code Control Source code control is a time machine for your work – you can go back.
- Fix the Problem, Not the Blame It doesn't really matter whether the bug is your fault or someone else's – it is still your problem, and it still needs to be fixed.
- Don't Panic When Debugging Take a deep breath and THINK! about what could be causing the bug.
- "select" Isn't Broken. It is rare to find a bug in the OS or the compiler, or even a third-party product or library. The bug is most likely in the application.
- Don't Assume It – Prove It Prove your assumptions in the actual environment – with real data and boundary conditions.
- Learn a Text Manipulation Language. You spend a large part of each day working with text. Why not have the computer do some of it for you?
- Write Code That Writes Code Code generators increase your productivity and help avoid duplication.
- You Can't Write Perfect Software Software can't be perfect. Protect your code and users from the inevitable errors.
- Design with Contracts Use contracts to document and verify that code does no more and no less than it claims to do.
- Crash Early A dead program normally does a lot less damage than a crippled one.
- Use Assertions to Prevent the Impossible Assertions validate your assumptions. Use them to protect your code from an uncertain world.
- Use Exceptions for Exceptional Problems Exceptions can suffer from all the readability and maintainability problems of classic spaghetti code. Reserve exceptions for exceptional things.
- Finish What You Start Where possible, the routine or object that allocates a resource should be responsible for deallocating it.
- Minimize Coupling Between Modules Avoid coupling by writing "shy" code and applying the Law of Demeter.
- Configure, Don't Integrate Implement technology choices for an application as configuration options, not through integration or engineering.
- Put Abstractions in Code, Details in Metadata Program for the general case, and put the specifics outside the compiled code base.
- Analyze Workflow to Improve Concurrency Exploit concurrency in your user's workflow.
- Design Using Services Design in terms of services – independent, concurrent objects behind well-defined, consistent interfaces.
- Always Design for Concurrency Allow for concurrency, and you'll design cleaner interfaces with fewer assumptions.
- Separate Views from Models Gain flexibility at low cost by designing your application in terms of models and views.
- Use Blackboards to Coordinate Workflow Use blackboards to coordinate disparate facts and agents, while maintaining independence and isolation among participants.
- Don't Program by Coincidence Rely only on reliable things. Beware of accidental complexity, and don't confuse a happy coincidence with a purposeful plan.
- Estimate the Order of Your Algorithms Get a feel for how long things are likely to take before you write code.
- Test Your Estimates Mathematical analysis of algorithms doesn't tell you everything. Try timing your code in its target environment.
- Refactor Early, Refactor Often Just as you might weed and rearrange a garden, rewrite, rework, and re-architect code when it needs it. Fix the root of the problem.
- Design to Test Start thinking about testing before you write a line of code.
- Test Your Software, or Your Users Will Test ruthlessly. Don't make your users find bugs for you.
- Don't Use Wizard Code You Don't Understand Wizards can generate reams of code. Make sure you understand all of it before you incorporate it into your project.
- Don't Gather Requirements – Dig for Them Requirements rarely lie on the surface. They're buried deep beneath layers of assumptions, misconceptions, and politics.
- Work With a User to Think Like a User It's the best way to gain insight into how the system will really be used.
- Abstractions Live Longer than Details Invest in the abstraction, not the implementation. Abstractions can survive the barrage of changes from different implementations and new technologies.
- Use a Project Glossary Create and maintain a single source of all the specific terms and vocabulary for a project.
- Don't Think Outside the Box – Find the Box When faced with an impossible problem, identify the real constraints. Ask yourself: "Does it have to be done this way? Does it have to be done at all?"
- Start When You're Ready. You've been building experience all your life. Don't ignore niggling doubts.
- Some Things Are Better Done than Described Don't fall into the specification spiral – at some point you need to start coding.
- Don't Be a Slave to Formal Methods. Don't blindly adopt any technique without putting it into the context of your development practices and capabilities.
- Costly Tools Don't Produce Better Designs Beware of vendor hype, industry dogma, and the aura of the price tag. Judge tools on their merits.
- Organize Teams Around Functionality Don't separate designers from coders, testers from data modelers. Build teams the way you build code.
- Don't Use Manual Procedures A shell script or batch file will execute the same instructions, in the same order, time after time.
- Test Early. Test Often. Test Automatically Tests that run with every build are much more effective than test plans that sit on a shelf.
- Coding Ain't Done 'Til All the Tests Run 'Nuff said.
- Use Saboteurs to Test Your Testing Introduce bugs on purpose in a separate copy of the source to verify that testing will catch them.
- Test State Coverage, Not Code Coverage Identify and test significant program states. Just testing lines of code isn't enough.
- Find Bugs Once Once a human tester finds a bug, it should be the last time a human tester finds that bug. Automatic tests should check for it from then on.
- English is Just a Programming Language Write documents as you would write code: honor the DRY principle, use metadata, MVC, automatic generation, and so on.
- Build Documentation In, Don't Bolt It On Documentation created separately from code is less likely to be correct and up to date.
- Gently Exceed Your Users' Expectations Come to understand your users' expectations, then deliver just that little bit more.
- Sign Your Work Craftsmen of an earlier age were proud to sign their work. You should be, too.
-- The Pragmatic Programmer Quick Reference Guide
From the book "The Pragmatic Programmer", copy here
Big hacks
Competitive Programming
Levels
- ICPC
- Regional ICPC,
- Topcoder,
- Codechef,
- SPOJ
Topics:
- Graph algorithms,
- Dynamic programming,
- Searching and sorting,
- Number theory and other mathematical concepts,
- Geometrical and network flow algorithms,
- Data structures.
-- Top 10 Algorithms and Data Structures for Competitive Programming
Baseline: ACM ICPC
The ACM ICPC is considered as the "Olympics of Programming Competitions". It is quite simply, the oldest, largest, and most prestigious programming contest in the world.
-- CodeChef, ICPC
Mission:
The ICPC, the “International Collegiate Programming Contest”, is an extra-curricular, competitive programming sport of the universities of the world. ICPC competitions provide gifted students with opportunities to interact, demonstrate, and improve their teamwork, programming, and problem-solving prowess. The ICPC is a global platform for academia, industry, and community to shine the spotlight on and raise the aspirations of the next generation of computing professionals as they pursue excellence.
Registration:
If a team wishes to be able to qualify for the ICPC World Finals, then before competing in ANY regional qualifying event, the coach and all team members must be fully registered in the ICPC Registration System. Registration may not be done retrospectively. Incomplete registration or circumvention that leads to incomplete or false data is grounds for immediate disqualification.
-- ICPC Rules
Data Science for team physics exploration
Stop oracles:
- Kaggle
f