Skip to content

Instantly share code, notes, and snippets.

@djui
Created September 2, 2014 09:36
Show Gist options
  • Save djui/673bcc72e4bbd4a179d6 to your computer and use it in GitHub Desktop.
Save djui/673bcc72e4bbd4a179d6 to your computer and use it in GitHub Desktop.
Tips

Tips

This is a collection of all kinds of tips that I found to be useful over the years as most of them reflect repetative tasks but that are seldom applied. As a human... I forget. This list will soon be merge with a much longer and older list and then, I guess, I will publish it maybe as gist on Github or part of my dot-files Git repository.

OS X / Mac

Fix graphviz/dot issues

Solution:

$ dot
dyld: Library not loaded: /usr/lib/libltdl.7.dylib
  Referenced from: /usr/local/bin/dot
    Reason: image not found

Fix:

$ brew link libtool

Keystrokes

⌃ ⌘ ⏏ Restart ⌥ ⌘ ⏏ Sleep ⌃ ⇧ ⏏ Put display to sleep (then also lock screen) ⇧ ⌘ Q Logout

Systemordnernamen ändern

/System/Library/CoreServices/SystemFolderLocalizations/de.lproj/SystemFolderLocalizations.strings

Cronjobs ("geplante Tasks")

$ launchctl load foobar.plist

ablegen in: ~/Library/LaunchAgents

http://osx.realmacmark.de/osx_launchd.php

Mail Datenbank verkleinern

$ sqlite3 ~/Library/Mail/Envelope\ Index vacuum

Konsole Welcome Message

$ /etc/motd

Ordner durch "Sortieren: Dateityp" nach oben bringen

Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Resources/German.lproj/Localized.strings

Folder = "Ordner" umbenennen in: Folder = " Ordner"

Symbols

 ⌃ ⌘ ⌥ ⇧ ⎋ ⏏ ⌫ ⇥ ⏎

Folder Icons

/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources

Finder Sidebar Icons

/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/Toolbar*.icns

Compiler Errors - Library not found

$ export CFLAGS="-I/opt/local/include -L/opt/local/lib"

Auflösung für X11

$ xdpyinfo | egrep 'dimens|resolut'

Convert epub from html to pdf

$ for i in `ls -1 *.html` ; do \
$   wkpdf -m 0 -y print -n -p tabloid -c -e -s /Users/uwe/$i -o /Users/uwe/pdf/$i.pdf \
$ done

Java apps stylen:

http://www.devdaily.com/apple/mac/java-mac-native-look/

Keyboard shortcuts auslesen/hinzufügen:

$ defaults read com.apple.AddressBook NSUserKeyEquivalents
$ defaults write com.apple.AddressBook NSUserKeyEquivalents -dict-add "Nächste Visitenkarte öffnen" "@~→"
$ defaults write com.apple.Finder NSUserKeyEquivalents '{"Open" = "\r";}'

Mouse Acceleration speed:

$ defaults write -globalDomain com.apple.mouse.scaling -float 0.8

Chromium mit Back & Forward Keyboard Shortcuts versehen:

$ defaults write org.chromium.Chromium NSUserKeyEquivalents '{"Forward" = "\177"; "Back" = "\010";}'

Precompiled OS X software:

http://sourceforge.net/projects/rudix/files/

Check if binary is 32bit, 64bit or PowerPC:

$ file /path/to/file.ext

Compile with GCC for 64bit and other good flags:

$ [/usr/local/bin/]gcc [-m32|-m64|-arch i386|-arch x86_64|-arch universal] -O0 -Wall -fopenmp -o test path/to/test.c

Update MacPorts, update the packages and list the installed packages:

$ sudo port -d selfupdate
$ sudo port upgrade outdated
$ port list installed

MacPorts uninstall:

http://trac.macports.org/wiki/FAQ#uninstall

Login Wallpaper

$ sudo defaults write /Library/Preferences/com.apple.loginwindow DesktopPicture "/path/to/replacement/image/file.jpg"

Add Recent Application List to Dock

$ defaults write com.apple.dock persistent-others -array-add \
  '{ "tile-data" = { "list-type" = 1; }; "tile-type" = "recents-tile"; }'
$ killall Dock

2D Dock Ansicht

$ defaults write com.apple.dock no-glass -boolean YES
$ killall Dock

Skype icons

(finger) (rock) (drunk) (smoking) (fubar) (swear) (tmi) (bug) (bandit) (headbang) (toivo) (mooning) (poolparty) (bow)

Applescript

http://aurelio.net/doc/as4pp.html

How to remove "List of Listings" from the TOC (when using Memoir class)

\renewcommand*{\lstlistlistingname}{List of Listings}
\newlistof{lstlistoflistings}{lol}{\lstlistlistingname}
:
\lstlistoflistings*

Log and see which files are in use (written, read)

$ sudo fs_usage # or
$ sudo fslogger

Access the menubar by keyboard

Either fn+F2 or fn+ctrl+F2

Export RSS feeds from Apple Mail

IFS=$a'\n' ; for i in $(find $HOME/Library/Mail/RSS/ -name "Info.plist") ; do grep "http://" $i | sed "s/.*\(http[^<]*\).*/\1/" | grep -v "PropertyList-1.0.dtd" ; done

Check what program is running on a certain port

$ sudo lsof -i :80 | grep LISTEN

Cleanup "Open with" menu

$ cd /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/
$ ./lsregister -kill -r -domain local -domain system -domain user
$ killall Finder

Remove title from all address book contacts

tell application "Contacts"
    repeat with contact in every person
        try -- catch missing values
            delete title of contact
        end try
    end repeat
    save
end tell

Shell

Add/Create mp4/m4a file with chapters

$ mp4box -chap chap_file file.m4a -out file.m4b

$ cat chap_fie
CHAPTER01=00:00:00
CHAPTER01NAME=The Quarrel between Achilles and Agamemnon
CHAPTER02=00:32:41
CHAPTER02NAME=Agammemnon's Dream
CHAPTER03=01:16:57

Sum up mp3 playtime in hours

$ brew install mp3info
$ ls | xargs -I {} mp3info -p "%S\n" "{}" | awk '{s+=$1} END {print s / 60 / 60}'

Set Java version to Java 7

$ java -version
$ cd /System/Library/Frameworks/JavaVM.framework/Versions/
$ sudo rm CurrentJDK
$ sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_40.jdk/Contents/ CurrentJDK
$ java -version

Monitor file changes in directory and run task

To only get notified about changes:

$ brew install fswatch
$ fswatch --help
$ fswatch ~/path/to/watch

To execute commands on changes:

$ sudo gem install filewatcher
$ filewatcher --help
$ filewatcher ~/path/to/watch "scp $FILENAME my-machine:."

Get external IP

$ curl ifconfig.me

Place the argument of the most recent command on the shell

$ M-.

Execute the last command again but replace foo with bar

$ ^foo^bar^

Execute the last command again but only replace the first occurence

$ !!:s/foo/bar

Quickly backup a file

$ cp filename{,.bak}

Execute the last command again as sudo

$ sudo !!

Change to the last use directory

$ cd -

Serve the current directory as HTTP Server

$ python -m SimpleHTTPServer

Draw Matrix style

$ tr -c "[:digit:]" " " < /dev/urandom | dd cbs=$COLUMNS conv=unblock |
     GREP_COLOR="1;32" grep --color "[^ ]"

Reuse all parameter of the previous command line

$ !*

diff two unsorted files without creating temporary file

$ diff <(sort file1) <(sort file2)

Close shell keeping all subprocess running

$ disown -a && exit

Insert the last command without the last argument (bash)

$ /usr/sbin/ab2 -f TLS1 -S -n 1000 -c 100 -t 2 http://www.google.com/
$ !:- http://www.commandlinefu.com/

SSH

SSH lost password from ssh_agent

This can happen when detaching from and reattaching to tmux. Then the environment variable for SSH_AUTH_SOCK gets lost. To re-add it, test:

$ env

...and search for SSH_AUTH_SOCK. If you found it, run:

$ SSH_AUTH_SOCK=/tmp/launch-rKCENX/Listeners ssh-add -l

Autologin to SSH server with public key

  1. Generate pub/priv key (rsa)
  2. Put pub key in ~/.ssh/authorized_keys

Generate a SSH Key

$ ssh-keygen -t rsa -b 2048 -f $HOME/.ssh/foobar_rsa_2048

$ ssh-keygen -t ecdsa -b 521 -f $HOME/.ssh/foobar_ecdsa_521

Add the public key to a host to allow remote logins

$ ssh-copy-id -i ~/.ssh/id_rsa.pub $HOSTNAME

SSH: "Too many authentication failures"

That usually means that your clients is randomly trying more unlocked public keys than your server is patient enough to accept. There are multiple evasive actions: Delete all the current keys with "ssh-add -D" and see if you can log in successfully.

TMUX

Change default directory/path to open

$ tmux set-option default-path "$HOME/dev"

or

: set-option default-path "$HOME/dev"

Ubuntu

Change hostname

$ sudo emacs -nw /etc/hostname
$ sudo emacs -nw /etc/hosts
$ sudo /etc/init.d/networking restart

Start VPN

$ nmcli con up id VPNNAME
$ nmcli con [status [id VPNNAME]]

Slow down Mouse movement

$ xinput set-prop "Djui's Mouse" "Device Accel Adaptive Deceleration" 1.0
$ xinput set-prop "Djui's Mouse" "Device Accel Constant Deceleration" 3.0

Installing .deb package

$ apt-get install openjdk-6-jre-headless

$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.7.deb
$ dpkg -i elasticsearch-0.90.7.deb

$ /usr/share/elasticsearch/bin/elasticsearch # or...
$ sudo /etc/init.d/elasticsearch start

Execute jobs in parallel

$ brew install moreutils

or

$ brew install parallel

Then:

$ cat bigfile | parallel --pipe --block 2M grep foo

or

$ < bigfile parallel --pipe --block 2M grep foo

or (as file)

#!/usr/local/bin/parallel --shebang -r --line-buffer youtube-dl -i -w -q

https://www.youtube.com/playlist?list=PLBXmeocYXDfCFnkCoxkSpFChle3gmidEn
https://www.youtube.com/playlist?list=PLBXmeocYXDfDp1j3aBZVVNFp4xW9zU3h-
https://www.youtube.com/playlist?list=PLOcrXzpA0W81LOjuTp8XZ2cjD4rjcTIET
https://www.youtube.com/playlist?list=PLOcrXzpA0W82rsJJKrmeBlY3_MS0uQv3h

Use strace to debug file permission problems

$ sudo strace -e open,access /etc/init.d elasticsearch

Emacs

Keyboard Macros

      C-x (’ Start recording a   keyboard macro
      C-x )’ Stop  recording the keyboard macro
      C-x e  Execute macro 1 time
C-u N C-x e  Execute macro N time
C-u 0 C-x e  Execute macro until reaching EOF

Convert file to utf-8

In emacs:

C-x RET c utf-8 RET C-x C-w NEW_FILENAME

or shell:

$ iconv -f ORIGINAL_CHARSET -t utf-8 ORIGINAL_FILE > NEW_FILE

Convert newlines

In emacs:

M-x set-buffer-file-coding-system utf-8-unix

Resize Emacs buffer with equal size

C-x + : M-x balance-windows

Compile elisp code from shell

emacs --eval '(byte-compile-file "xxx.el")'

Set buffer encoding system

M-x set-buffer-encoding-system RET iso-latin-1 or utf8

List font-lock faces

M-x list-faces-display

List color palette

M-x list-colors-display

http://www.gnu.org/software/emacs/manual/html_node/emacs/Standard-Faces.html

Retrieve information under cursor (also about font-lock face)

C-u C-x = describe-char

Jump back and forth between unread messages and used buffer

C-c C-Space

Generally useful

apropos              (search Emacs function and variable descriptions)
describe-key-briefly (describe a keystroke command)
describe-bindings    (list all current commands which have keystrokes)
toggle-read-only     (toggle a buffer between read-only and read-write)

Keybindings

C-h u Let's you type a key binding and see what is connected to it
M-x global-set-key Let's you bind keys directly

Check what did change before quitting a buffer

diff-buffer-with-file

Auto-complete in Emacs (Erlang mode)

M-/

RCIRC client: Toggle between new messages and current buffer

C-c C-SPACE

Execute replacement on rectangle

C-x r t

Install Emacs on OS X with GCC and X support

$ brew install --use-gcc emacs --cocoa --with-x --use-git-head

awk-mode without comment face-font syntax-highlighting

add:

(modify-syntax-entry ?# "< b" awk-mode-syntax-table)
(modify-syntax-entry ?\n "> b" awk-mode-syntax-table)

to the awk-mode.el and reload the file + awk-mode when opening a file.

Insert real tab

C-q <TAB>

Save a list of installed packages

C-h v package-activated-list

(ac-nrepl auto-complete auto-highlight-symbol autopair clojure-project-mode
clojure-test-mode dash diff-git erlang expand-region github-theme
gitty go-mode highlight-parentheses ibuffer-vc ido-ubiquitous iedit
indent-guide lua-mode magit-simple-keys magithub magit markdown-mode
move-text multiple-cursors nrepl clojure-mode paredit popup project-mode
levenshtein rainbow-delimiters ruby-mode rust-mode cm-mode s scala-mode
smart-tab smex yasnippet)

Awesome

Three column mode in Awesome

In tilebottom view, press "Mod4+shift+h/j" 2 or 3 times

Screen

Set title in screen

See: http://aperiodic.net/screen/title_examples

$ echo -ne '\ekcommand-line\e\\'

Git

for d in ls -1 ; do if [ -e "$d/.git" ] ; then pushd "$d" > /dev/null pwd git status -s popd > /dev/null fi done

Solve case (in)sensitive duplicated files on OSX

You have myfile and myFile and git/OSX get confused.

$ git mv myFile myFile2
$ git mv myFile2 myfile

Restore deleted files

$ git log --diff-filter=D --summary | grep <file_path>
$ git rev-list -n 1 HEAD -- <file_path>
$ git checkout <deleting_commit>^ -- <file_path>

Workflow

git remote add origin [email protected]:Kreisquadratur/circle_packing.git
...
git clone [email protected]:Kreisquadratur/circle_packing.git
...
git add .
git commit
git push origin master
(git push origin newbranch)
(git branch -r)
...
git pull origin
...
git checkout -b newbranch
...

Show only commit being done on the current/local branch

$ git log origin/master.. --no-merges

Find commits not merged upstream

$ git cherry -v origin

Show all aggregated file changes in a diff

$ git diff --stat origin/master

Only show differences as file lists

$ git diff --name-status [BRANCH1]..[BRANCH2]

Relative commit names

 C^  == C~
 C^  == C^1
 C~  == C~1
 C^^ == C^1^1

        C^1 \
        C^2 - C -
        C^3 /

C~3 C~2 C~1 \
        C^2 - C -
        C^3 /

Update all submodules

$ git submodule foreach git pull origin master

Cheatsheets

http://andyjeffries.co.uk/articles/25-tips-for-intermediate-git-users
http://airto.hosted.ats.ucla.edu/wiki/index.php/Setting_Up_and_Using_Git

See diff changes of a given file (endless)

$ git diff -p FILENAME

Select multiple files for staging if they are removed

$ git add -u

Delete remote branch

$ git push origin :BRANCH

or locally:

$ git branch -d BRANCH

Find commit the current branch is based on:

$ git merge-base master HEAD

or:

$ git merge-base master BRANCH

or:

$ cat .git/logs/refs/heads/BRANCH

and look for: "branch: Created from HEAD"

Push with newly created tags

$ git push --tags

Erlang

Pretty-print an Erlang string

See ehf_string:format/1

Show usage screen with flags

$ erl +U

Compile Erlang (R14B03) using brew with Xcode 4 present

$ brew install --use-gcc erlang b

or

$ ./otp_build autoconf
$ CFLAGS=-O0 ./configure --disable-hipe --enable-darwin-64bit
$ ./otp_build boot

or just

$ CFLAGS=-O0 ./otp_build setup --disable-hipe --enable-darwin-64bit

Change OTP release version name in shell

/Users/uwe/dev/OTP/src/otp_r14b01_klarna/erts/emulator/beam/erl_bif_info.c Change static char erts_system_version[]

LD

LD often stands for Loop Data in Erlang code

Get content of fun function

1> Fun = fun() -> io:format("ok~n", []) end.
2> erlang:fun_info(Fun, env).
2> erl_pp:function(Fun).

Check if a process runs old module code

> erlang:check_process_code(Pid, Module) -> bool()

Delete old module

> erlang:delete_module(Module) -> true | undefined.

Get list of processes and their initial call

> [{P,case I of
        {proc_lib,init_p,5} -> proc_lib:translate_initial_call(P);
        _                   -> I
       end} || {P,{initial_call,I}} <- [{P),process_info(P), initial_call)} || P0 <- processes()]]).

Mnesia table files

As in mnesia_lib.erl defined: .DAT %% DETS files .DMP %% Dumped ets tables .DCD %% Disc copies data .DCL %% Disc copies log .TMP

Compilation

Compile with MACRO:

> c("path/to/src/module.erl", [{d,'TEST'}]).

Klarna Kred

Interesting user_defaults

help()          %% @doc List all commands

e(N, T)         %% @doc Get the nth element either of a list or tuple
p(X) | long(X)  %% @doc io format a variable

cl(M, F, A)     %% @doc Call a non exported function
export(M, F, A) %% @doc Export an unexported function
export_all(M)   %% @doc Export all functions of a module

c(M)            %% @doc Compile a module with debug_info
src(Module)     %% @doc Path to the erl file of a module
beam(Module)    %% @doc Path to the beam file of a module
mm()            %% @doc List modified modules
lm()            %% @doc Load modified modules
lrm()           %% @doc Reload modified modules and purge-delete removed modules
nl()            %% @doc Load modified modules on all known nodes

r(M, F)         %% @doc Debug a module's function call using Redbug
rbugon(M, [F])  %% @doc Longterm Debug a module's function call using Redbug

m(M) | '?'(M)   %% @doc Lookup macro definition

pid(X)          %% @doc Get a valid Pid representation out of anything
bt(Pid)         %% @doc Backtrace a process
pi()            %% @doc List open ports (tcp, efile, ...)
fullsweep(Pid)  %% @doc Garbage collection on all processes
pid_diff(Sleep) %% @doc Show change in reductions and heap_size of a pid over time

Redbug

Standard use text for tracing another host

redbug:start("module:fun/arity -> stack;return", [ {time, s*1000}
                                                 , {msgs, 2000}
                                                 , {print_re, ""}
                                                 , {target, nonode@nohost}
                                                 ]).

Less verbose printouts

redbug:start("my_module", [ {arity, true}
                          , {print_form, "~s"},
                          , {print_re, ""}
                          , ...
                          ]).

Compile Yaws without sendfile

$ cd lib/yaws
$ make clean
$ autoconf
$ ./configure --disable-sendfile
$ make

LaTeX

Auto make PDF from tex file in the background watcher

$ latexmk -pvc -pdf foo.tex

Computer Modern Font:

  • CMU Serif
  • Latin Modern Roman

Very nice LaTeX Thesis style

http://www.tex.ac.uk/ctan/macros/latex/contrib/classicthesis/

FFMPEG

Extract AAC audio from mp4 or flv:

$ ffmpeg -i input.mp4 -vn -acodec copy output.m4a
$ ffmpeg -i input.webm -vn -acodec copy output.ogg
$ ffmpeg -i input.flv -vn -acodec copy output.m4a

Video kodieren:

$ ffmpeg -i input.mov -s 640x480 -b 600k -r 24 -ar 22050 -ab 96k -vcodec h264 -acodec aac output.mp4

MP4 AAC Dateien Kapitel Chapter hinzufügen

$ sudo port install mp4v2
$ mp4chaps

Create gifs (mov2gif)

$ ffmpeg -i input.mov -pix_fmt rgb24 output.gif
$ convert -layers Optimize output.gif output_optimized.gif

Bitcoin

For local mining:

echo "rpcuser=djui"          > ~/Library/Application\ Support/Bitcoin/bitcoin.conf
echo "rpcpassword=12345678" >> ~/Library/Application\ Support/Bitcoin/bitcoin.conf

/Applications/Bitcoin.app/Contents/MacOS/bitcoin -server &
./poclbm.py --user=djui --pass=12345678 --device=1

Chromebook / ChromeOS

Remove rootfs verification

$ sudo /usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verification --partitions 2

Install manual fonts

$ sudo cp ~/Downloads/*.ttf /usr/share/fonts/croscore/

Run local sshd

$ ssh-keygen
$ cat /home/chronos/user/.ssh/id_rsa.pub >> /home/chronos/user/.ssh/authorized_keys
$ chmod 600 /home/chronos/user/.ssh/authorized_keys
$ sudo bash
# mkdir -p /mnt/stateful_partition/etc/ssh
# ssh-keygen -t rsa -f /mnt/stateful_partition/etc/ssh/ssh_host_rsa_key
# ssh-keygen -t dsa -f /mnt/stateful_partition/etc/ssh/ssh_host_dsa_key
# /usr/sbin/sshd
# exit

Clojure

Shortest (and fastest?) clojure.core/last

http://www.4clojure.com/problem/solutions/19

(defn last [x] (reduce #(-> %2) x))

Shortest REPL

(->>(read)(eval)(prn)(while :t))

Shortest "At least one true but not all"

> not=

Set Intersection

> (comp set filter)

Lazy-Cat

The following are all equal:

> (cons x (lazy-seq (...)))
> (lazy-seq (cons x (...)))
> (lazy-cat [x] (...))

gapmap fun

(defn gapmap
  "Returns a lazy sequence consisting of the result of applying f to all
  adjacent values of coll. f should be a function of 2 arguments. If coll
  contains less than 2 items, it is returned and f is not called."
  {:added "1.6"}
  ([f coll]
   (if-let [r (next coll)] ; at least two items?
     (lazy-seq (gapmap-internal f (first coll) r))
     coll)))
     
(defn- gapmap-internal
  [f x coll]
  (if-let [y (first coll)]
    (cons (f x y) (gapmap-internal f y (next coll)))))

Shortest Symmetric Binary Tree

#(= % ((fn m [[v l r]] (if v [v (m r) (m l)])) %))

or

(letfn [(m [[v l r]] (if v [v (m r) (m l)]))] #(= % (m %)))

The function compares the original binary tree (%) with a temporary binary tree ((m %)) which has all its left and right anchestors swapped (m means mirror).

The trick is to use a classic functional approach: Express what should be done, not how. Instead of implementing the comparison of every anchestor yourself, let the system do the comparison.

The trade-off is readability vs memory space (2x size of btree).

Mine:

(fn sbt? [[_ [lv ll lr :as l] [rv rl rr :as r]]]
  (or (= nil l r)
      (and (= lv rv)
           (sbt? [_ ll rr])
           (sbt? [_ lr rl]))))

Eclipse

No Anti-aliased fonts

$ defaults write scalaide.product.id AppleAntiAliasingThreshold 20
$ defaults write org.eclipse.eclipse AppleAntiAliasingThreshold 20

Riak

How Riak handles backends

Riak has many backend types, e.g. storage_backend which is used by Riak KV. Riak KV's riak_kv initializes riak_kv_vnode which get_env the backend callback module name for a specific type (e.g. storage_backend) and calls Mod:start on it. The backend has to return a backend state record which is handed over which every api call (e.g. Mod:put(Bucket, Key, IndexSpecs, Val, ModState). Thus, the backend can be stateful (have servers, ets tables, etc.) but are not linked or monitored by the user( e.g. riak_kv_vnode) who holds the backend name (#state.mod=Mod) and its state (#state.modstate=ModState).

SVG

Rasterize SVG to TIFF in higher DPI

The Squiggle tool itself doesn't allow to modify the outfile DPI, thus uses 96 DPI.

$ java -jar -Xmx1g /Applications/Squiggle.app/Contents/Resources/batik-rasterizer.jar -dpi 300 -m image/tiff -d outfile.tiff infile.svg

Vagrant

You have to be in a dedicated directory. Vagrant images are under ~/.vagrant.d

$ vagrant init "Ubuntu 12.10 x64" http://files.vagrantup.com/precise64.box
$ vagrant init "Debian 6 Squeeze x64" http://puppet-vagrant-boxes.puppetlabs.com/debian-607-x64-vbox4210-nocm.box
$ vagrant up

...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment