diff --git a/_output/Etc/PHP_Kohana.ctxt b/_output/Etc/PHP_Kohana.ctxt new file mode 100644 index 000000000..733f81ae7 --- /dev/null +++ b/_output/Etc/PHP_Kohana.ctxt @@ -0,0 +1,78 @@ +# Installing +wget "http://kohanaphp.com/download?modules%5Bauth%5D=Auth&languages%5Ben_US%5D=en_US&format=zip" -O k.zip &&\ +unzip -q k.zip && rm k.zip &&\ +mv Kohana_*/* . && rm -rf Kohana_* &&\ +rm -f "Kohana License.html" &&\ +# htaccess +cat example.htaccess | sed 's/RewriteBase .*/RewriteBase \//g' > .htaccess && rm example.htaccess &&\ +echo Done! Go and edit application/config/config.php and change the site stuff. + +# Public HTML +mkdir -p public_html &&\ +mv index.html public_html &&\ +mv .htaccess public_html &&\ +echo Done. Now edit index.html's paths + +Git ignore +(echo \*.swo; echo \*.swp; echo .DS_Store; echo Thumbs.db; echo \*~; echo application/logs; echo application/cache ) > .gitignore &&\ + +# Database +$config['default'] = array +( + 'benchmark' => TRUE, + 'persistent' => FALSE, + 'connection' => array + ( + 'type' => 'mysql', + 'user' => 'leet', // set to db user name + 'pass' => 'l33t', // set to db user password + 'host' => 'localhost', + 'port' => FALSE, + 'socket' => FALSE, + 'database' => 'leetdb' // set to db name + ), + 'character_set' => 'utf8', + 'table_prefix' => '', + 'object' => TRUE, + 'cache' => FALSE, + 'escape' => TRUE +); + + +// ORM model +class Post_Model extends ORM { + protected $has_one = array('user'); // has_many, belong_to, has_one, has_and_belongs_to_many +} + +// ORM +$post = ORM::factory('post', 1); +$post->name = "Post name"; +$post->save(); +foreach ($post->categories as $category) +{ + echo $category->name; +} + +// Find (returns even if no row is found) +$o = ORM::factory('article')->find(1); +$o = ORM::factory('article')->where('title', $title)->find(); +if (!$o->loaded) { die('Not found'); } +echo $o->title; + +// Find_all +$o = ORM::factory('article')->find_all(); +foreach ($o as $article) { echo $article->title; } + +// ->$saved +// ->$changed[] +// ->$object_name (Blog_Post_Model => "blog_post") +// ->$primary_key ('id') +// ->$primary_val ('username') - more userfriendly identifier +// ->$table_name +// ->$ignored_columns = array('whatever') +// ->$table_columns = array('id', 'username') +// ->$sorting = array('last_login' => 'desc') -- default sorting + +// + + diff --git a/_output/Etc/Rails_2.ctxt b/_output/Etc/Rails_2.ctxt new file mode 100644 index 000000000..4a3eaa213 --- /dev/null +++ b/_output/Etc/Rails_2.ctxt @@ -0,0 +1,104 @@ +# Debug +logger.debug "xx" + +# Controller stuff +class MyController < ApplicationController::Base +controller.response.body + + # Filters + before_filter :require_login # Looks for require_login method + before_filter MyFilter # Looks for MyFilter class + before_filter { |ct| head(400) if ct.params["stop_action"] } + around_filter :catch_exceptions + after_filter :xx + + layout "admin_area" # Looks for the view file + layout "admin_area", :except => [ :rss, :whatever ] + layout :foo # Looks for private function foo + + private + def whatever ... + +class MyFilter + def self.filter(controller, &block) + +# Model + +belongs_to :user +validates_presence_of :user +default_scope :order => 'id DESC' +named_scope :today, :conditions = "created_at x" +named_scope :today, lambda {{ :conditions = [ "created_at between ? and ?", 1.hour.ago.utc, 300.seconds.ago.utc ] }} +# Then you can call feed.today + +# Controller methods +render :action => 'help', :layout => 'help' +render :text => 'so and so' +render :status => :created, :location => post_url(post) # With HTTP headers +redirect_to :action => 'index' +render :partial => 'product', :collection => @products, :as => :item, :spacer_template => "product_ruler" +return head(:method_not_allowed) +head :created, :location => '...' + +url_for :controller => 'posts', :action => 'recent' + +location = request.env["SERVER_ADDR"] + +# For views +auto_discovery_link_tag(:rss, {:action => "feed"}, {:title => "RSS Feed"}) +javascript_include_tag "foo" +stylesheet_link_tag +image_tag + +# Ruby stuff! +# Defining a class method (not a typo) +Fixnum.instance_eval { def ten; 10; end } +Fixnum.ten # => 10 + +# Defining an instance method +Fixnum.class_eval { def number; self; end } +7.number #=> 7 + +# Multiple arguments, send() +class Klass + def hello(*args); "Hello " + args.join(' '); end +end +Klass.new.send :hello, "gentle", "readers" + +def can(*args) + yield if can?(*args) +end +# can(x) {...} => if can?(x) {...} + + + +# Struct +class Foo < Struct.new(:name, :email) +end + +j = Foo.new("Jason", "jason@bateman.com") +j.name = "Hi" +print j.name + + +# Struct +class Foo < Struct.new(:name, :email) +end + +j = Foo.new("Jason", "jason@bateman.com") +j.name = "Hi" +print j.name + + +# Method missing + def method_missing(method_name, *arguments) + if method_name.to_s[-1,1] == "?" + self == method_name.to_s[0..-2] + + +# Rails logger +Rails.logger.info("...") + +# To string +:hello_there.to_s + diff --git a/_output/Rakefile b/_output/Rakefile new file mode 100644 index 000000000..b19e74ee5 --- /dev/null +++ b/_output/Rakefile @@ -0,0 +1,9 @@ +desc "Build" +task :build do + system "proton build" +end + +desc "Deploy" +task :deploy => :build do + system "git update-ghpages rstacruz/cheatsheets -i _output" +end diff --git a/_output/bash.html b/_output/bash.html new file mode 100644 index 000000000..f28fe3ca6 --- /dev/null +++ b/_output/bash.html @@ -0,0 +1,208 @@ + + + + + + + + +

Bash

+

String substitutions by patterns

+ +
STR=/path/to/foo.c
+
+echo ${STR%.c}      #=> "/path/to/foo"
+echo ${STR%.c}.o    #=> "/path/to/foo.o"
+echo ${STR##*.}     #=> "c" (extension)
+
+BASE=${SRC##*/}     #=> "foo.c" (basepath)
+DIR=${SRC%$BASE}    #=> "/path/to"
+
+ +

Substitutions by regex

+ +
echo ${STR/hi/hello}          # Replace first match
+echo ${STR//hi/hello}         # Replace all matches
+echo ${STR/#hi/hello}         # ^hi
+echo ${STR/%hi/hello}         # hi$
+
+echo "${STR:0:3}"             # .substr(0, 3) -- position, length
+echo "${STR:-3:3}"            # Negative position = from the right
+
+echo ${#line}                 # Length of $line
+
+[ -z "$CC" ] && CC=gcc        # CC ||= "gcc"  assignment
+${CC:=gcc}                    # $CC || "gcc"
+
+ +

Loops

+ +
for i in /etc/rc.*; do
+  echo $i
+end
+
+ +

Functions

+ +

Defining functions

+ +
myfunc() { ... }
+fuction myfunc { ... }
+fuction myfunc() { ... }
+
+ +

Returning strings

+ +
myfunc() {
+    local myresult='some value'
+    echo $myresult
+}
+
+result=$(myfunc)
+
+ +

Errors

+ +
myfunc() { return 1; }
+
+ +

Arguments

+ +
$#                          # Number of arguments
+$*                          # All args
+$1                          # First argument
+
+ +

Ifs - files

+ +
# File conditions
+if [ -a FILE ]; then        # -e exists         -d directory        -f file
+fi                          # -r readable       -w writeable        -x executable
+                            # -h symlink        -s size > 0
+
+# File comparisons
+if [ FILE1 -nt FILE2 ]      # -nt   1 more recent than 2
+                            # -ot   2 more recent than 1
+                            # -ef   same files
+
+ +

Ifs

+ +
# String
+if [ -z STRING ]            # empty?
+if [ -n STRING ]            # not empty?
+
+# Numeric
+if [ $? -eq 0 ]             # -eq -ne -lt -le -gt -ge
+                            # $? is exit status by the way
+
+# Etc
+if [ -o noclobber ]         # if OPTIONNAME is enabled
+if [ ! EXPR ]               # not
+if [ ONE -a TWO ]           # and
+if [ ONE -o TWO ]           # or
+
+# Regex
+if [[ "A" =~ "." ]]
+
+ +

Numeric comparisons

+ +
if $(( $a < $b ))
+
+ +

Unset variables

+ +

Assume $FOO is not set. Doing this will result in that:

+ +
${FOO:-word}                # Returns word
+${FOO:+word}                # Returns empty, or word if set
+${FOO:=word}                # Sets parameter to word, returns word
+${FOO:?message}             # Echoes message and exits
+
+${FOO=word}                 # : is optional in all of the above
+
+ +

Numeric calculations

+ +
$((RANDOM%=200))            # Random number 0..200
+$((a + 200))                # $ is optional
+
+ +

Arrays

+ +
Fruits[0]="Apple"
+Fruits[1]="Banana"
+Fruits[2]="Orange"
+
+# Declaring using declare -a
+declare -a Fruits=('Apple' 'Banana' 'Orange')
+
+echo ${Fruits[0]}           # Element #0
+echo ${Fruits[@]}           # All elements, space-separated
+echo ${#Fruits[@]}          # Number of elements
+echo ${#Fruits}             # String length of the 1st element
+echo ${#Fruits[3]}          # String length of the Nth element
+echo ${Fruits[@]:3:2}       # Range (from position 3, length 2)
+
+Fruits=("${Fruits[@]}" "Watermelon")    # Push
+Fruits=( ${Fruits[@]/Ap*/} )            # Remove by regex match
+unset Fruits[2]                         # Remove one item
+Fruits=("${Fruits[@]}")                 # Duplicate
+Fruits=("${Fruits[@]}" "${Veggies[@]}") # Concatenate
+lines=(`cat "logfile"`)                 # Read from file
+
+ +

Misc crap

+ +
command -V cd               #=> "cd is a function/alias/whatever"
+
+ +

Options

+ +
set -o noclobber            # Avoid overlay files (echo "hi" > foo)
+set -o errexit              # Used to exit upon error, avoiding cascading errors
+set -o pipefail             # Unveils hidden failures
+set -o nounset              # Exposes unset variables
+
+ +

Glob options

+ +
set -o nullglob             # Non-matching globs are removed  ('*.foo' => '')
+set -o failglob             # Non-matching globs throw errors
+set -o nocaseglob           # Case insensitive globs
+set -o dotglob              # Wildcards match dotfiles ("*.sh" => ".foo.sh")
+set -o globstar             # Allow ** for recursive matches ('lib/**/*.rb' => 'lib/a/b/c.rb')
+
+ +

set GLOBIGNORE as a colon-separated list of patterns to be removed from glob +matches.

+ +

Trap errors

+ +
trap 'echo Error at about $LINENO' ERR
+
+ +

or

+ +
traperr() {
+  echo "ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}"
+}
+
+set -o errtrace
+trap traperr ERR
+
+ +

References

+ + + + + + + + + + diff --git a/_output/brew.html b/_output/brew.html new file mode 100644 index 000000000..c5c531e2e --- /dev/null +++ b/_output/brew.html @@ -0,0 +1,50 @@ + + + + + + + + +

Brew

+

Nice Homebrew packages:

+ + + +

Not from brew:

+ + + +

Tmux

+ +

Install a more-recent version that supports tmux -C

+ +
brew install https://github.com/adamv/homebrew-alt/raw/master/other/tmux-iterm2.rb
+
+ +

Install the wrapper for stuff to enable OSX clipboard to work

+ +
brew install reattach-to-user-namespace --wrap-pbcopy-and-pbpaste
+
+ +

Make sure that your VIM alias uses it

+ +
alias vim="reattach-to-user-namespace /Application/MacVim/Contents/MacOS/Vim"
+
+ + + + + + + + diff --git a/_output/capybara.html b/_output/capybara.html new file mode 100644 index 000000000..bca71a670 --- /dev/null +++ b/_output/capybara.html @@ -0,0 +1,112 @@ + + + + + + + + +

Capybara

+

Navigating

+ +
visit articles_path
+
+ +

Clicking links and buttons

+ +
click 'Link Text'
+click_button
+click_link
+
+ +

Interacting with forms

+ +
attach_file
+fill_in 'First Name', :with => 'John'
+check
+uncheck
+choose
+select
+unselect
+
+ +

Querying

+ +

Takes a CSS selector (or XPath if you're into that). +Translates nicely into RSpec matchers:

+ +
page.should have_no_button("Save")
+
+ +

Use should haveno* versions with RSpec matchers b/c +should_not doesn't wait for a timeout from the driver

+ +
page.has_content?
+page.has_css?
+page.has_no_content?
+page.has_no_css?
+page.has_no_xpath?
+page.has_xpath?
+page.has_link?
+page.has_no_link?
+page.has_button?("Update")
+page.has_no_button?
+page.has_field?
+page.has_no_field?
+page.has_checked_field?
+page.has_unchecked_field?
+page.has_no_table?
+page.has_table?
+page.has_select?
+page.has_no_select?
+
+ +

Finding

+ +
find
+find_button
+find_by_id
+find_field
+find_link
+locate
+
+ +

Scoping

+ +
within
+within_fieldset
+within_table
+within_frame
+scope_to
+
+ +

Scripting

+ +
execute_script
+evaluate_script
+
+ +

Debugging

+ +
save_and_open_page
+
+ +

Miscellaneous

+ +
all
+body
+current_url
+drag
+field_labeled
+source
+wait_until
+current_path
+
+ + + + + + + + diff --git a/_output/cinema4d.html b/_output/cinema4d.html new file mode 100644 index 000000000..361afb19b --- /dev/null +++ b/_output/cinema4d.html @@ -0,0 +1,20 @@ + + + + + + + + +

Cinema4d

+
E R T   : Move/rotate/scale
+P       : snapping
+
+ + + + + + + + diff --git a/_output/devise.html b/_output/devise.html new file mode 100644 index 000000000..d58cbd027 --- /dev/null +++ b/_output/devise.html @@ -0,0 +1,148 @@ + + + + + + + + +

Devise

+

Devise is a flexible authentication +gem.

+ +

Installation

+ +

Rails 3: Add the following to your Gemfile

+ +
gem "devise"
+gem "hpricot"
+gem "ruby_parser"
+
+ +

Install devise in your project

+ +
$ rails generate devise:install
+
+ +

Generate devise for your model

+ +
$ rails generate devise MODEL
+$ rake db:migrate
+
+ +

(Optional) Generate devise views

+ +
$ rails generate devise:views
+
+ +

Helpers

+ +
user_signed_in?
+current_user
+user_session
+destroy_user_session_path (Logout)
+new_user_session_path (Login)
+edit_user_registration_path (Edit registration)
+new_user_registration_path (Register new user)
+
+ +

Controller stuff

+ +
before_filter :authenticate_user!
+
+ +

Model

+ +

Model options

+ +
class User < ActiveRecord::Base
+  devise :database_authenticatable,
+    :registerable,
+    :confirmable,
+    :recoverable,
+    :rememberable,
+    :trackable,
+    :validatable
+end
+
+ +

Migration helpers

+ +
create_table :users do |t|
+  t.database_authenticatable
+  t.confirmable
+  t.recoverable
+  t.rememberable
+  t.trackable
+  t.timestamps
+end
+
+ +

Routing

+ +

Authenticated and unauthenticated routes

+ +
unauthenticated do
+   root :to => 'home#index'
+end
+
+authenticated do
+  root :to => 'dashboard#index'
+end
+
+ +

As

+ +
as :user do
+  get 'sign_in', :to => 'devise/sessions#new'
+end
+
+ +

Devise_for magic

+ +
devise_for :users
+
+    # Session routes for Authenticatable (default)
+         new_user_session GET  /users/sign_in                    {:controller=>"devise/sessions", :action=>"new"}
+             user_session POST /users/sign_in                    {:controller=>"devise/sessions", :action=>"create"}
+     destroy_user_session GET  /users/sign_out                   {:controller=>"devise/sessions", :action=>"destroy"}
+
+    # Password routes for Recoverable, if User model has :recoverable configured
+        new_user_password GET  /users/password/new(.:format)     {:controller=>"devise/passwords", :action=>"new"}
+       edit_user_password GET  /users/password/edit(.:format)    {:controller=>"devise/passwords", :action=>"edit"}
+            user_password PUT  /users/password(.:format)         {:controller=>"devise/passwords", :action=>"update"}
+                          POST /users/password(.:format)         {:controller=>"devise/passwords", :action=>"create"}
+
+    # Confirmation routes for Confirmable, if User model has :confirmable configured
+    new_user_confirmation GET  /users/confirmation/new(.:format) {:controller=>"devise/confirmations", :action=>"new"}
+        user_confirmation GET  /users/confirmation(.:format)     {:controller=>"devise/confirmations", :action=>"show"}
+                          POST /users/confirmation(.:format)     {:controller=>"devise/confirmations", :action=>"create"}
+
+ +

Customizing devise_for

+ +
devise_for :users,
+  :path => "usuarios",
+  :path_names => {
+    :sign_in => 'login',
+    :sign_out => 'logout',
+    :password => 'secret',
+    :confirmation => 'verification',
+    :unlock => 'unblock',
+    :registration => 'register',
+    :sign_up => 'cmon_let_me_in' }
+
+ +

Test helpers

+ +
sign_in @user
+sign_out @user
+
+ + + + + + + + diff --git a/_output/figlets.txt b/_output/figlets.txt new file mode 100644 index 000000000..d5780b6b2 --- /dev/null +++ b/_output/figlets.txt @@ -0,0 +1,1293 @@ + **** ** + */// * /** +/ /* /** + *** ***** ****** + /// *///// **///** + * /* /** /** +/ **** //****** + //// ////// + +### ### + # # # # + ## # ### + # # # # +### ### + + + ____ + // // ( ) __ ___ ___ / __ // ( ) ___ + //__ // / / // ) ) //___) ) // ) ) // ) ) // / / // ) ) // / / + ) ) // / / // / / // // / / // / / // / / ((___/ / // / / +((___/ / // / / // / / ((____ ((___/ / ((___/ / // / / ( ( ((___( ( + + + + ___ + //___) ) + // +((____ + o + <|> + / > + o__ __o/ __o__ \o__ __o o__ __o \o__ __o o__ __o/ + /v | /> \ | |> /v v\ | v\ /v | + /> / \ o/ / \ < > /> <\ / \ <\ /> / \ + \ \o/ <| \o/ \ / \o/ / \ \o/ + o | \\ | o o | o o | + <\__ / \ _\o__ / \ __/> <\__ / \ + + + + o o + <|> _<|>_ + < > + | o __o__ + o__/_ <|> /> \ + | / \ o/ + | \o/ <| + o | \\ + <\__ / \ _\o__<< ><< +><< ><< >< +><< ><< >< ><<<><< ><< ><<< >< ><<< ><< +><< ><< ><< ><< ><< ><< ><< ><< < ><<><< ><< >< ><< +><< ><<><< ><< ><< ><< ><< ><< >< ><<><< ><< ><<<<< ><< +><< ><<><< ><< ><< ><< ><< >< >< ><><<><< ><< >< +><< ><< ><< ><<<><<< ><< ><< ><<< ><<<><<><<< ><<<< + +d8888b. .d8b. .d8888. d888888b .o88b. +88 `8D d8' `8b 88' YP `88' d8P Y8 +88oooY' 88ooo88 `8bo. 88 8P +88~~~b. 88~~~88 `Y8b. 88 8b +88 8D 88 88 db 8D .88. Y8b d8 +Y8888P' YP YP `8888Y' Y888888P `Y88P' + + + _ . . + \ ___ ___ | | + |/ \ .' ` | | + | ` |----' | | + `___,' `.___, /\__ /\__ + + _ _ +| | (_) +| |__ _ __ _ +| '_ \| |/ _` | +| |_) | | (_| | +|_.__/|_|\__, | + __/ | + |___/ +______________________________________________ + _ + / , / , / ` +---/__--------__----__---/__--------__--_/__-- + / ) / / ) / ' / ) / /___) / +_(___/_/___(___/_(___ _/___/_/___(___ _/______ + / + (_ / +01100010 01101001 01101110 01100001 01110010 01111001 + +_| _| _| +_|_|_| _| _|_| _|_|_| _| _| +_| _| _| _| _| _| _|_| +_| _| _| _| _| _| _| _| +_|_|_| _| _|_| _|_|_| _| _| + + + +8 888888888o 8 888888888o. ,o888888o. .8. +8 8888 `88. 8 8888 `88. . 8888 `88. .888. +8 8888 `88 8 8888 `88 ,8 8888 `8b :88888. +8 8888 ,88 8 8888 ,88 88 8888 `8b . `88888. +8 8888. ,88' 8 8888. ,88' 88 8888 88 .8. `88888. +8 8888888888 8 888888888P' 88 8888 88 .8`8. `88888. +8 8888 `88. 8 8888`8b 88 8888 ,8P .8' `8. `88888. +8 8888 88 8 8888 `8b. `8 8888 ,8P .8' `8. `88888. +8 8888 ,88' 8 8888 `8b. ` 8888 ,88' .888888888. `88888. +8 888888888P 8 8888 `88. `8888888P' .8' `8. `88888. + +8 888888888o. `8.`888b ,8' .8. `8.`8888. ,8' +8 8888 `^888. `8.`888b ,8' .888. `8.`8888. ,8' +8 8888 `88. `8.`888b ,8' :88888. `8.`8888. ,8' +8 8888 `88 `8.`888b .b ,8' . `88888. `8.`8888.,8' +8 8888 88 `8.`888b 88b ,8' .8. `88888. `8.`88888' +8 8888 88 `8.`888b .`888b,8' .8`8. `88888. `8. 8888 +8 8888 ,88 `8.`888b8.`8888' .8' `8. `88888. `8 8888 +8 8888 ,88' `8.`888`8.`88' .8' `8. `88888. 8 8888 +8 8888 ,o88P' `8.`8' `8,`' .888888888. `88888. 8 8888 +8 888888888P' `8.` `8' .8' `8. `88888. 8 8888 + _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ +( b | u | b | b | l | e ) + \_/ \_/ \_/ \_/ \_/ \_/ + ____ __ __ __ ____ _ _ ____ __ ____ +( _ \( )( )( ) ( _ \( )_( )( ___) /__\ ( _ \ + ) _ < )(__)( )(__ ) _ < ) _ ( )__) /(__)\ )(_) ) +(____/(______)(____)(____/(_) (_)(____)(__)(__)(____/ + + ### / + ### #/ + ## ## + ## ## + ## ## + /### /### ## /### /### ## /## ## #### + / ### / / ### / ## / ### / / ### / ## / ### ## ### / + / ###/ / ###/ ## / ###/ / ###/ ##/ ### ## ###/ +## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## +### / ## /# ## ## ## ## ## ## ## ## ## n + ######/ ####/ ## ### / ######## ####### ## ## ######### u + ##### ### ## ##/ ### ### ###### ## ## #### ### m + ### ## / ### b + #### ### ## / ##### ### e + /###### /# ## / /####### /# r + / ###/ ## / / ###/ 2 + + *** + *** * + ** *** + ** * + ** *** **** + **** **** ** *** **** **** **** * **** + * *** * * *** * ** *** * *** * ** **** * *** * + * **** * **** ** ** * **** ** * **** +** ** ** ** ** ** ** ** ** ** +** ** ** ** ** ** ** ** ** ** +** ** ** ** ** ** ** ** ** ** +** ** ** ** ** ** ** ** ** ** +*** * ** ** ** ** ** ** *** ** ** + ******* ***** ** *** * *** * ******** *** ***** ** + ***** *** ** *** *** *** *** *** ** + *** + **** *** + ******* ** + * **** + + + * + ** + ** + ** + **** ** ** **** + * *** * ** *** ** *** * + * **** ** * *** ** **** +** ** *** *** ** ** +** ** ** ** ** ** +** ** ** ** ** ** +** ** ** ** ** ** +** ** ** ** ** ** +******* ** ** ********* +****** ** ** **** *** +** ** ** *** +** * ***** *** +** * ******** ** + ** * * **** + * + + _// _//_// + _// _//_// + _/// _// _/_/ _/_// _/// _// _//_// _// + _// _// _// _// _// / _// _// _// _//_// _// +_// _// _// _// _// _/ _//_// _// _//_/_// + _// _// _// _// _/ _/ _/_//_// _// _//_// _// + _/// _// _/// _// _/// _/// _// _///_///_// _// + + __ __ +.----.| |--.--.--.-----.| |--.--.--. +| __|| | | | || <| | | +|____||__|__|_____|__|__||__|__|___ | + |_____| + O)) O)) + O) O)) O)) + O))) O)) O)) O)) O)))) O)O) O) O)) O)) O)) + O)) O)) O)) O)) O)) O))O)) O)) O)) O)) O)) O)) +O)) O)) O))O)) O)) O)) O))) O)) O)) O)) O)O)) + O)) O)) O)) O)) O)) O)) O)) O)) O)) O)) O)) O)) + O))) O)) O))O))) O))O)) O)) O)) O)) O)))O)) O)) + + 888 888 + 888 888 + 888 888 + .d8888b .d88b. 888 .d88b. .d8888b .d8888b 8888b. 888 +d88P" d88""88b888d88""88b88K 88K "88b888 +888 888 888888888 888"Y8888b."Y8888b..d888888888 +Y88b. Y88..88P888Y88..88P X88 X88888 888888 + "Y8888P "Y88P" 888 "Y88P" 88888P' 88888P'"Y888888888 + + + + +eeee eeeee eeeeeee eeeee e e eeeee eeee eeeee +8 8 8 88 8 8 8 8 8 8 8 8 8 8 8 +8e 8 8 8e 8 8 8eee8 8e 8 8e 8eee 8eee8e +88 8 8 88 8 8 88 88 8 88 88 88 8 +88e8 8eee8 88 8 8 88 88ee8 88 88ee 88 8 + + , + _. _ ._ -+- _ __ __ _. +(_.(_)[ ) | (/,_) _) (_] + +..%%%%....%%%%...%%..%%..%%%%%%..%%%%%....%%%%....%%%%...%%%%%%. +.%%..%%..%%..%%..%%%.%%....%%....%%..%%..%%..%%..%%........%%... +.%%......%%..%%..%%.%%%....%%....%%%%%...%%%%%%...%%%%.....%%... +.%%..%%..%%..%%..%%..%%....%%....%%..%%..%%..%%......%%....%%... +..%%%%....%%%%...%%..%%....%%....%%..%%..%%..%%...%%%%.....%%... +................................................................ + .,-::::: ... .::::::. . : ::: .,-::::: +,;;;'````' .;;;;;;;. ;;;` ` ;;,. ;;; ;;;,;;;'````' +[[[ ,[[ \[[,'[==/[[[[,[[[[, ,[[[[, [[[[[[ +$$$ $$$, $$$ ''' $$$$$$$$$"$$$ $$$$$$ +`88bo,__,o,"888,_ _,88P 88b dP888 Y88" 888o888`88bo,__,o, + "YUMMMMMP" "YMMMMMP" "YMmMY" MMM M' "MMMMMM "YUMMMMMP" + .,-::::: ... .::::::. . : ::: ::: . .,:::::: +,;;;'````' .;;;;;;;. ;;;` ` ;;,. ;;; ;;; ;;; .;;,.;;;;'''' +[[[ ,[[ \[[,'[==/[[[[,[[[[, ,[[[[, [[[ [[[[[/' [[cccc +$$$ $$$, $$$ ''' $$$$$$$$$"$$$ $$$_$$$$, $$"""" +`88bo,__,o,"888,_ _,88P 88b dP888 Y88" 888o888"888"88o, 888oo,__ + "YUMMMMMP" "YMMMMMP" "YMmMY" MMM M' "MMMMMM MMM "MMP" """"YUMMM + __ ____ ____ __ __ _____ ___ ____ ___ + / ]| \ / T| T__T T| | / \ | \ | \ + / / | D )Y o || | | || __jY Y| D )| \ + / / | / | || | | || l_ | O || / | D Y +/ \_ | \ | _ |l ` ' !| _] | || \ | | +\ || . Y| | | \ / | T l !| . Y| | + \____jl__j\_jl__j__j \_/\_/ l__j \___/ l__j\_jl_____j + + __ __ __ +.----.----|__.----| |--.-----| |_ +| __| _| | __| <| -__| _| +|____|__| |__|____|__|__|_____|____| + + + + + + + _. . . __ _ o, __ +(__(_/_/ (_/_)_<_\/| . \/ ._>| . \| . \/ ._>| '_> +\___||_| | _/\___.| _/| _/\___.|_| + |_| |_| |_| + whistl +X XX +X XX +X XX +X XX +X XX +X .X + +dwhistled + +################## +##[`'`']###\`~'/## +###|::|####(o o)## +###|::|#####\ / \# +#############"#### + __ __ + _/ _|||()/ _| _ || +/o\ ] | ]|| ]o\|/ \| ] +\(L| L|L|L|\_/L_n|L| + + +eftipiti + + _ _ _ _ _ + ,'_)( ) (_) ( ) ( ) + ___ | | | | _ __ ___ | |_ ___ | | +( o_)( _)( _)( )( _)( o )( o \( o )( _) + \( /_\ /_\ /_\/_\ \_/ /___/ \_/ /_\ + + _ + __ ,'_7/7 ()/7 _ /7() __ +,'o//_7 /_7/7/_7,'o| ///7,',' +|_(// // //// |_,7//// \_\ + + |"| _ . . # # # # + _|_|_ _|_|_ ()_() . .:::. # #..# # + (o o) (o o) (o o) :(o o): . # #O #) # +ooO--(_)--Ooo-ooO--(_)--Ooo-ooO--`o'--Ooo-ooO--(_)--Ooo-o#O-#(_#--#oo- + | _ _ _ _ + |.===. o' \,=./ `o o' \,=./ `o + {}o o{} (o o) (o o) +ooO--(_)--Ooo-ooO--(_)--Ooo-ooO--(_)--Ooo- + __ _ o _ + __ )L`)L _ __ _ _ ___ )L __ __ +(('(( (( (( \(((/'((_( (( (('(| + + _______ _______ _________ _______ +( ____ \( ____ )\__ __/( ____ \ +| ( \/| ( )| ) ( | ( \/ +| (__ | (____)| | | | | +| __) | _____) | | | | +| ( | ( | | | | +| (____/\| ) ___) (___| (____/\ +(_______/|/ \_______/(_______/ + + .|'; ||` + || || +'||' .|''|, `||''|, .|''|| .|''|, '||''| + || ||..|| || || || || ||..|| || +.||. `|... .|| ||. `|..||. `|... .||. + + + /~\ | +-|-/~\| ||/~\~|~/~\|~~\(~ + | \_/ \_/|| | \_/|__/_) + | + .. s + oec : < .z@8"` :8 + @88888 .u . !@88E .88 x. . + 8"*88% .d88B :@8c u '888E u :888ooo .@88k z88u + 8b. ="8888f8888r us888u. 888E u@8NL -*8888888 ~"8888 ^8888 + u888888> 4888>'88" .@88 "8888" 888E`"88*" 8888 8888 888R + 8888R 4888> ' 9888 9888 888E .dN. 8888 8888 888R + 8888P 4888> 9888 9888 888E~8888 8888 8888 888R + *888> .d888L .+ 9888 9888 888E '888& .8888Lu= 8888 ,888B . + 4888 ^"8888*" 9888 9888 888E 9888. ^%888* "8888Y 8888" + '888 "Y" "888*""888" '"888*" 4888" 'Y" `Y" 'YP + 88R ^Y" ^Y' "" "" + 88> + 48 + '8 + + + .u . + .d88B :@8c +="8888f8888r + 4888>'88" + 4888> ' + 4888> + .d888L .+ + ^"8888*" + "Y" + + + + + .--. +: .-' +: `;.-..-..---. .---. .-..-. +: : : :; :`-'_.'`-'_.': :; : +:_; `.__.'`.___;`.___;`._. ; + .-. : + `._.' +__ _____ _____ ___ ___ __ __ + ) ____) ) ( ) ( \ ___) ( ( ) ) + / / __ / \ / \ | (__ \ \/ / +( ( ( \ ( ) ( ) | __) \ / + \ \__) ) \ / \ / | ( ) / +__) (____) (_____) (___/ \______/ (_____ + + , ,, + _ || || ' + / \\ /'\\ =||= ||/\\ \\ _-_ +|| || || || || || || || || +|| || || || || || || || || +\\_-| \\,/ \\, \\ |/ \\ \\,/ + / \ _/ +'----` + ___ ____ __ ___ ____ ____ _ _ __ + / __)( _ \ / _\ / __)( __)( __)/ )( \( ) +( (_ \ ) // \( (__ ) _) ) _) ) \/ (/ (_/\ + \___/(__\_)\_/\_/ \___)(____)(__) \____/\____/ +.eeeeee..eeeeeee...eeeeee..eeeeeee..eee.eeeeee.eeeeeee..eeeeeeeee. +@@@@@@@@:@@@@@@@@:@@@@@@@@:@@@@@@@@:@@@:@@@@@@:@@@@@@@@:@@@@@@@@@: +%%%------%%%--%%%-%%%--%%%-%%%--%%%-%%%-%%%----%%%--%%%----%%%---- +&&&++++++&&&&&&&++&&&&&&&&+&&&++&&&+&&&+&&&&&++&&&++&&&++++&&&++++ +|||*||||*||||||***||||||||*|||**|||*|||*|||||**|||**|||****|||**** +!!!==!!!=!!!=!!!==!!!==!!!=!!!==!!!=!!!=!!!====!!!==!!!====!!!==== +::::::::#:::##:::#:::##:::#::::::::#:::#::::::#:::##:::####:::#### +@......@@...@@...@...@@...@.......@@...@......@...@@...@@@@...@@@@ + + _____ _____.__ __ .__ + ________________ _/ ____\/ ____\__|/ |_|__| + / ___\_ __ \__ \\ __\\ __\| \ __\ | + / /_/ > | \// __ \| | | | | || | | | + \___ /|__| (____ /__| |__| |__||__| |__| +/_____/ \/ +68 65 78 + + /' /' /' /' + /' /' /' /' + /'__ ____ /' /' . . , , ____ ____ _____,/' + /' ) /' )--/' /' /' /| |/ / /' )--/' )--/' /' + /' /' /' /' /' /' /' /' | /| /' /' /' /' /' /' /' +/' /(__(___,/' (__(__(___,/(___|/' |/(__(___,/' (___,/' (___,/(__ + /' + / /' + (___,/' + + , , + __ _ _ _/_ _ +_(_/ (_(/___(_(__(_(_ + + + ___ ___ ___ ___ + ___ /\ \ /\ \ /\__\ /\ \ + /\ \ /::\ \ /::\ \ /::| | /::\ \ + \:\ \ /:/\ \ \ /:/\:\ \ /:|:| | /:/\:\ \ + /::\__\ _\:\~\ \ \ /:/ \:\ \ /:/|:|__|__ /::\~\:\ \ + __/:/\/__/ /\ \:\ \ \__\ /:/__/ \:\__\ /:/ |::::\__\ /:/\:\ \:\__\ + /\/:/ / \:\ \:\ \/__/ \:\ \ /:/ / \/__/~~/:/ / \:\~\:\ \/__/ + \::/__/ \:\ \:\__\ \:\ /:/ / /:/ / \:\ \:\__\ + \:\__\ \:\/:/ / \:\/:/ / /:/ / \:\ \/__/ + \/__/ \::/ / \::/ / /:/ / \:\__\ + \/__/ \/__/ \/__/ \/__/ + ___ ___ ___ + /\ \ /\ \ ___ /\ \ + \:\ \ /::\ \ /\ \ /::\ \ + \:\ \ /:/\:\ \ \:\ \ /:/\:\ \ + /::\ \ /::\~\:\ \ /::\__\ /:/ \:\ \ + /:/\:\__\ /:/\:\ \:\__\ __/:/\/__/ /:/__/ \:\__\ + /:/ \/__/ \/_|::\/:/ / /\/:/ / \:\ \ \/__/ + /:/ / |:|::/ / \::/__/ \:\ \ + \/__/ |:|\/__/ \:\__\ \:\ \ + |:| | \/__/ \:\__\ + \|__| \/__/ + ___ ___ ___ ___ + /\__\ /\ \ /\ \ /\__\ + ___ /:/ _/_ /::\ \ |::\ \ /:/ _/_ + /\__\ /:/ /\ \ /:/\:\ \ |:|:\ \ /:/ /\__\ + /:/__/ /:/ /::\ \ /:/ \:\ \ __|:|\:\ \ /:/ /:/ _/_ + /::\ \ /:/_/:/\:\__\ /:/__/ \:\__\ /::::|_\:\__\ /:/_/:/ /\__\ + \/\:\ \__ \:\/:/ /:/ / \:\ \ /:/ / \:\~~\ \/__/ \:\/:/ /:/ / + ~~\:\/\__\ \::/ /:/ / \:\ /:/ / \:\ \ \::/_/:/ / + \::/ / \/_/:/ / \:\/:/ / \:\ \ \:\/:/ / + /:/ / /:/ / \::/ / \:\__\ \::/ / + \/__/ \/__/ \/__/ \/__/ \/__/ + ___ ___ + /\ \ /\__\ + ___ /::\ \ ___ /:/ / + /\__\ /:/\:\__\ /\__\ /:/ / + /:/ / /:/ /:/ / /:/__/ /:/ / ___ + /:/__/ /:/_/:/__/___ /::\ \ /:/__/ /\__\ + /::\ \ \:\/:::::/ / \/\:\ \__ \:\ \ /:/ / + /:/\:\ \ \::/~~/~~~~ ~~\:\/\__\ \:\ /:/ / + \/__\:\ \ \:\~~\ \::/ / \:\/:/ / + \:\__\ \:\__\ /:/ / \::/ / + \/__/ \/__/ \/__/ \/__/ + ___ ___ ___ ___ + ___ / /\ / /\ /__/\ / /\ + / /\ / /:/_ / /::\ | |::\ / /:/_ + / /:/ / /:/ /\ / /:/\:\ | |:|:\ / /:/ /\ + /__/::\ / /:/ /::\ / /:/ \:\ __|__|:|\:\ / /:/ /:/_ + \__\/\:\__ /__/:/ /:/\:\ /__/:/ \__\:\ /__/::::| \:\ /__/:/ /:/ /\ + \ \:\/\ \ \:\/:/~/:/ \ \:\ / /:/ \ \:\~~\__\/ \ \:\/:/ /:/ + \__\::/ \ \::/ /:/ \ \:\ /:/ \ \:\ \ \::/ /:/ + /__/:/ \__\/ /:/ \ \:\/:/ \ \:\ \ \:\/:/ + \__\/ /__/:/ \ \::/ \ \:\ \ \::/ + \__\/ \__\/ \__\/ \__\/ + ___ ___ + ___ / /\ ___ / /\ + / /\ / /::\ / /\ / /:/ + / /:/ / /:/\:\ / /:/ / /:/ + / /:/ / /:/~/:/ /__/::\ / /:/ ___ + / /::\ /__/:/ /:/___ \__\/\:\__ /__/:/ / /\ + /__/:/\:\ \ \:\/:::::/ \ \:\/\ \ \:\ / /:/ + \__\/ \:\ \ \::/~~~~ \__\::/ \ \:\ /:/ + \ \:\ \ \:\ /__/:/ \ \:\/:/ + \__\/ \ \:\ \__\/ \ \::/ + \__\/ \__\/ + ___ ___ ___ ___ + ___ / /\ / /\ / /\ / /\ + /__/\ / /::\ / /::\ / /::| / /::\ + \__\:\ /__/:/\:\ / /:/\:\ / /:|:| / /:/\:\ + / /::\ _\_ \:\ \:\ / /:/ \:\ / /:/|:|__ / /::\ \:\ + __/ /:/\/ /__/\ \:\ \:\ /__/:/ \__\:\ /__/:/_|::::\ /__/:/\:\ \:\ + /__/\/:/~~ \ \:\ \:\_\/ \ \:\ / /:/ \__\/ /~~/:/ \ \:\ \:\_\/ + \ \::/ \ \:\_\:\ \ \:\ /:/ / /:/ \ \:\ \:\ + \ \:\ \ \:\/:/ \ \:\/:/ / /:/ \ \:\_\/ + \__\/ \ \::/ \ \::/ /__/:/ \ \:\ + \__\/ \__\/ \__\/ \__\/ + ___ ___ + ___ / /\ ___ / /\ + /__/\ / /::\ /__/\ / /::\ + \ \:\ / /:/\:\ \__\:\ / /:/\:\ + \__\:\ / /::\ \:\ / /::\ / /:/ \:\ + / /::\ /__/:/\:\_\:\ __/ /:/\/ /__/:/ \ \:\ + / /:/\:\ \__\/~|::\/:/ /__/\/:/~~ \ \:\ \__\/ + / /:/__\/ | |:|::/ \ \::/ \ \:\ + /__/:/ | |:|\/ \ \:\ \ \:\ + \__\/ |__|:|~ \__\/ \ \:\ + \__\| \__\/ + + '_/_ /'_ +/ /(/(/( + + _ _ _ + | |_(_)_ ____ _(_) + | __| | '__\ \ / / | + | |_| | | \ V /| | + \__|_|_| \_/ |_| + + + o o + +o8 .oPYo. .oooo. ooYoYo. o8 odYo. .oPYo. + 8 .oooo8 .dP 8' 8 8 8 8' `8 8oooo8 + 8 8 8 oP' 8 8 8 8 8 8 8. + 8 `YooP8 `Yooo' 8 8 8 8 8 8 `Yooo' +:8 :.....::.....:..:..:..:....::..:.....: +oP :::::::::::::::::::::::::::::::::::::: +..::::::::::::::::::::::::::::::::::::::: + + __ __.______ _______ _ _ _ _______ ___ ______ ______ _______ + \ \ / /|____ |____ .| | | | | |____ |_ |____ |____ |. __ | + \ V / _ | | | || | | | | | | | | | | | _ | || | | | + ___\ \ | | |_| | || |/ /_/ / | | | | | || | |_|| | | | + |______| | | | ||_______/ |_| |_| |_|| | |_| |_| + |_| |_| |_| + # # # # ###### + ###### # ### ####### # ### ###### # ### + # #### # # #### # #### ########## + # # # # # # # # # + # # ########## # # # ## +########## # # # ########## # ## + ####### # ####### ####### ## + +# +# ### +#### +# +# +# + ####### + +'|| '|| + || .. || ... .... .. ... + || .' ||' || '' .|| || || + ||'|. || | .|' || || || +.||. ||. '|...' '|..'|' .||. ||. + + +|Am3 + ___ __ __ +/\_ \ /'__`\ /\ \ +\//\ \ __ _ __ _ __ __ __/\_\L\ \ \_\ \ + \ \ \ /'__`\ /\`'__\/\`'__\/\ \/\ \/_/_\_<_ /'_` \ + \_\ \_/\ \L\.\_\ \ \/ \ \ \/ \ \ \_\ \/\ \L\ \/\ \L\ \ + /\____\ \__/.\_\\ \_\ \ \_\ \/`____ \ \____/\ \___,_\ + \/____/\/__/\/_/ \/_/ \/_/ `/___/> \/___/ \/__,_ / + /\___/ + \/__/ + + | | + + - -| + | | | | + - - - + + + _/ + _/ _/_/ _/_/_/ _/_/_/ + _/ _/_/_/_/ _/ _/ _/ _/ + _/ _/ _/ _/ _/ _/ +_/ _/_/_/ _/_/_/ _/ _/ + + +lll tt tt +lll eee tt tt eee rr rr sss +lll ee e tttt tttt ee e rrr r s +lll eeeee tt tt eeeee rr sss +lll eeeee tttt tttt eeeee rr s + sss +.-. .-..-..-..-..-..-..-. +| |__ | || .` || || | > < +`----'`-'`-'`-'`----''-'`-` + +:| :| +:| ,::\ .::/ :|_/ :~~/ :::| /::| :::\ ,::\ :\/| :~~/ +:| `::/ `::\ :|~\ :::, :| \::| :|:| `::/ :::| :::, + ,.:/ + | | +/=\=\ /=| /=| /= = /=| +| | | \=| \=| | | \=| + + + +.::: .:: .:: .:: .: .::: .:: .:: .:: .:: .:: + .:: .: .:: .:: .:: .:: .: .:: .:: .:: .: .:: .: .:: + .:: .: .::.:: .:: .:: .: .:: .:: .::.::::: .::.::::: .:: + .:: .: .::.:: .:: .:: .::.:: .:: .::.: .: +.::: .: .:: .:: .:::.::: .:: .::.:: .:::: .:::: + .::: + /~\ +|/~\ /~\ /~~|\/-|-/~\| ||/~\ +| | |\__|/\ | \_/ \_/|| + + |/ _ + ||\ _| | |/ + + +._ _ o._ o +| | ||| || + + _ + __ _ ___ __ _ __ _(_) ___ __ _ + |__` |/ _ \__` |__` | |/ _ ' _` | + | | (_) | | | | | | | | | | | + |_|\___/ |_| |_|_|_| |_| |_| + +mnemonic +-- --- .-. ... . + +# # ### #### # # ### # # +## ## # # # # # # # # # # +# # # # # # #### # # # # # +# # # # # # # # # # # +# # ### #### # ### ### + + ""|""| |""||""|'\/ + | ' |_|| ' | _\ + | | + oo .8888b + 88 " +88d888b. .d8888b. 88d888b. .d8888b. dP dP dP 88aaa .d8888b. +88' `88 88' `88 88' `88 88' `"" 88 88 88 88888888 88 88' `88 +88 88 88. .88 88 88 88. ... 88. .88 88 88 88. .88 +dP dP `88888P8 dP dP `88888P' `8888P88 88 dP `88888P8 + .88 88 + d8888P dP + + +88d888b. .d8888b. dP dP +88' `88 88' `"" 88 88 +88 88 88. ... 88. .88 +dP dP `88888P' `8888P88 + .88 + d8888P + oo + +88d888b. .d8888b. 88d888b. .d8888b. dP dP dP dP dP 88d888b. +88' `88 88' `88 88' `88 88' `"" 88 88 88 88888888 88 88 88' `88 +88 88 88. .88 88 88 88. ... 88. .88 88 88. .88 88 88 +dP dP `88888P8 dP dP `88888P' `8888P88 88 `88888P' dP dP +ooooooooooooooooooooooooooooooooooooo~~~~.88~88~ooooooooooooooooooooooooooo + d8888P dP + dP dP oo dP + 88 88 88 +.d888b88 .d8888b. 88d888b. 88 dP 88d888b. .d8888b. .d888b88 +88' `88 88ooood8 88' `88 88 88 88' `88 88ooood8 88' `88 +88. .88 88. ... 88 88 88 88 88 88. ... 88. .88 +`88888P8 `88888P' dP dP dP dP dP `88888P' `88888P8 +oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo + + oo + +88d888b. .d8888b. 88d888b. .d8888b. dP dP dP +88' `88 88' `88 88' `88 88' `"" 88 88 88 +88 88 88. .88 88 88 88. ... 88. .88 88 +dP dP `88888P8 dP dP `88888P' `8888P88 88 + .88 88 + d8888P dP + {__ + {_ {__ +{__ {__ {_ {__ {_ {__ {__ {__ {____ + {__ {__{__{_ {__ {_ {__ {__ {_ {__ {__ + {__ {__{__{_ {__{_ {__ {__{_____ {__ {___ + {__ {__{__{__ {__ {__ {__ {__{_ {__ +{___ {__{__{__ {__ {___ {____ {__ {__ + {__ {__ + + + + _ _____ _ _ ___ ___ ___ _ __ +| |/ ( | \ / ) _ \/ __) __) |/ / +| / / | | \ v / |_) > _)> _)| < +|__/ \_) | || __/\___)___)_|\_\ + | || | + |_||_| + + + + gg + "" + ,ggg,,ggg, ggg gg ,g, ,gggg, ,gggggg, gg gg,gggg, + ,8" "8P" "8, d8"Yb 88bg,8'8, dP" "Yb dP""""8I 88 I8P" "Yb + I8 8I 8I dP I8 8I ,8' Yb i8' ,8' 8I 88 I8' ,8i +,dP 8I Yb,,dP I8, ,8I,8'_ 8) ,d8,_ _,dP Y8,_,88,_,I8 _ ,d8' +8P' 8I `Y88" "Y8P" P' "YY8P8PP""Y8888PP8P `Y88P""Y8PI8 YY88888P + I8 + I8 + I8 + I8 + I8 + I8 + + I8 + I8 +88888888 + I8 + I8 + I8 + ,I8, + ,d88b, + 8P""Y8 + + + + + + + ooooooo + ooooooo o888 888o +888 888 888888888 +888 888 888o o888 + 88ooo88 88ooo88 + +157 143 164 141 154 + + ___ __ _ _ __ ___ + / _ \ / _` | '__/ _ \ +| (_) | (_| | | | __/ + \___/ \__, |_| \___| + |___/ +_________________ooooo__ +_ooooo___oooo__oo____oo_ +oo___oo_oo___o_______oo_ +oo___oo___oo_______ooo__ +oo___oo_o___oo___ooo____ +_ooooo___oooo__oooooooo_ +________________________ + + + + ____ ____ _ _ _ ____ +(____) (____)(_) ( ) (_)(____) +(_)_(_)( )_( )(_)_(_)_(_)(_)_(_) +(____) (__)_) (__) (__) (____) +(_) (_) +(_) (_) + /^^ + /^^ +/^ /^^ /^^ /^^ /^^ /^^ /^^^^ +/^ /^^ /^ /^^ /^^ /^^ /^^ /^^ /^^ +/^ /^^/^^^^^ /^^/^^ /^^ /^/^^ /^^^ +/^^ /^^ /^ /^^ /^^ /^^ /^^ /^^ +/^^ /^^^^ /^^ /^^^/^^ /^^/^^ /^^ +/^^ + o o o + O O O + O O o + o o O +.oOo. .oOo. OoOo. OoOo. o .oOo. .oOo +O o OooO' O o O o O OooO' `Ooo. +o O O o O o O o O O +oOoO' `OoO' `OoO' `OoO' Oo `OoO' `OoO' +O +o' + + _ _ _ _ _ _ + /_//_'/_//_//_'/ +/ / / + +@@@@@@@ @@@@@@ @@@ @@@@@@ @@@@@@ @@@ @@@ +@@@@@@@@ @@@@@@@@ @@@ @@@@@@@ @@@@@@@@ @@@@ @@@ +@@! @@@ @@! @@@ @@! !@@ @@! @@@ @@!@!@@@ +!@! @!@ !@! @!@ !@! !@! !@! @!@ !@!!@!@! +@!@@!@! @!@ !@! !!@ !!@@!! @!@ !@! @!@ !!@! +!!@!!! !@! !!! !!! !!@!!! !@! !!! !@! !!! +!!: !!: !!! !!: !:! !!: !!! !!: !!! +:!: :!: !:! :!: !:! :!: !:! :!: !:! + :: ::::: :: :: :::: :: ::::: :: :: :: + : : : : : :: : : : : : :: : + + ___ ___ + /'___)/'___) + _ _ _ _ | (__ | (__ _ _ +( '_`\ ( ) ( )| ,__)| ,__)( ) ( ) +| (_) )| (_) || | | | | (_) | +| ,__/'`\___/'(_) (_) `\__, | +| | ( )_| | +(_) `\___/' + ^ ^ ^ ^ ^ ^ ^ + /p\ /y\ /r\ /a\ /m\ /i\ /d\ +<___><___><___><___><___><___><___> + + _ _ + ___ ___ ___| |_ ___ ___ ___| |___ ___ +| _| -_| _| _| .'| | . | | -_|_ -| +|_| |___|___|_| |__,|_|_|_ |_|___|___| + |___| +______________________________________________________________ +/~~~~~~~\__/~~~~~~~~\_/~~\_______/~~~~\_/~~~~~~~~\_/~~~~~~~~\_ +/~~\__/~~\_/~~\_______/~~\________/~~\__/~~\_______/~~\_______ +/~~~~~~~\__/~~~~~~\___/~~\________/~~\__/~~~~~~\___/~~~~~~\___ +/~~\__/~~\_/~~\_______/~~\________/~~\__/~~\_______/~~\_______ +/~~\__/~~\_/~~~~~~~~\_/~~~~~~~~\_/~~~~\_/~~~~~~~~\_/~~\_______ +______________________________________________________________ +\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +//////// \\///////// \/// \\\\\\\///// \///////// \///////// \\/////// \ +/// \\/// \/// \\\\\\\/// \\\\\\\\/// \\/// \\\\\\\/// \\\\\\\/// \/// \ +//////// \\/////// \\\/// \\\\\\\\/// \\/////// \\\/////// \\\\\\/// \\\ +/// \\/// \/// \\\\\\\/// \\\\\\\\/// \\/// \\\\\\\/// \\\\\\\\/// \\\\\ +/// \\/// \///////// \///////// \///// \///////// \/// \\\\\\\//////// \ +\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +======================= +======================= +======================= +======================= += = ==== === = = += = == = == = = += ======= === == += ======= ====== == += ======= = ==== === += ======== ===== === +======================= + + +oooo d8b .ooooo. ooo. .oo. .oo. .oooo. ooo. .oo. +`888""8P d88' `88b `888P"Y88bP"Y88b `P )88b `888P"Y88b + 888 888 888 888 888 888 .oP"888 888 888 + 888 888 888 888 888 888 d8( 888 888 888 +d888b `Y8bod8P' o888o o888o o888o `Y888""8o o888o o888o + + + +ebg13 + _ _ + | | | | + ____ ___ _ _ ____ __| |_____ __| | + / ___) _ \| | | | _ \ / _ | ___ |/ _ | +| | | |_| | |_| | | | ( (_| | ____( (_| | +|_| \___/|____/|_| |_|\____|_____)\____| + + dMMMMb .aMMMb dMP dMP dMP .aMMMb dMMMMb .aMMMb .aMMMb dMMMMb + dMP.dMP dMP"dMP dMP dMP dMP dMP"dMP dMP dMP dMP"VMP dMP"dMP dMP.dMP + dMMMMK" dMP dMP dMP dMP dMP dMMMMMP dMP dMP dMP dMMMMMP dMMMMP" + dMP"AMF dMP.aMP dMP.dMP.dMP dMP dMP dMP dMP dMP.aMP dMP dMP dMP +dMP dMP VMMMP" VMMMPVMMP" dMP dMP dMP dMP VMMMP" dMP dMP dMP + + +888,8, e88 88e 8P d8P 8P d8P e88 88e +888 " d888 888b P d8P P d8P d888 888b +888 Y888 888P d8P d d8P d Y888 888P +888 "88 88" d8P d8 d8P d8 "88 88" + + + + + +|\ |\ | |~\ | +|/ | | `| |_| | +|\ | | |` ||| |\ + @@@@@@ @@@@@@@ @@@ @@@@@@ @@@@@@ @@@@@@@ + !@@ @@! @@@ @@! @@! @@@ @@! @@@ @@! @@@ + !@@!! @!@!@!@ @!! @!@ !@! @!@ !@! @!@ !@! + !:! !!: !!! !!: !!: !!! !!: !!! !!: !!! + ::.: : :: : :: : ::.: : : :. : : :. : :: : : + + + o + , __ ,_ _ _|_ +/ \_/ / | | |/ \_| + \/ \___/ |_/|_/|__/ |_/ + /| + \| + ___ ___ ___ __ ___ __ __ ___ +/ __)( _)( ,) ( )( _) / _) ( ) ( ,\ +\__ \ ) _) ) \ )( ) _)( (_ /__\ ) _/ +(___/(___)(_)\_)(__)(_) \__)(_)(_)(_) + | | + __| __ \ _` | _` | _ \\ \ \ / +\__ \ | | | ( | ( | ( |\ \ \ / +____/_| |_|\__,_|\__,_|\___/ \_/\_/ + + _|_ |- +_\||()|`|_ + + __ __ + _____/ /___ _____ / /_ + / ___/ / __ `/ __ \/ __/ + (__ ) / /_/ / / / / /_ +/____/_/\__,_/_/ /_/\__/ + + #| #| H| + #HH|#| H| #H| +##H| #| #| #HH|##HH| + H|#| #|## H|## +##H| #H|#H|#HH| #HH| + + _ + // _/_ + _ // _ _. __ o _ / +/_)_ + + + + + + + +

Fitness

+

Target heart rate

+ +
max heart rate = (220 - age)
+
+ +

"The target heart rate method is a simple formula: take 220 and minus your age. +Then take that number and multiply it by .75 - .85, which will give you your +percentages of 75% -- 85% of your Max. HR."

+ +

http://www.bodybuilding.com/fun/mike1.htm

+ +

Warmup sets

+ + + +

http://corw.in/warmup/

+ + + + + + + + diff --git a/_output/heroku.html b/_output/heroku.html new file mode 100644 index 000000000..12ebf4b20 --- /dev/null +++ b/_output/heroku.html @@ -0,0 +1,49 @@ + + + + + + + + +

Heroku

+

Create an app

+ +
heroku create sushi
+
+ +

Custom domains

+ +
heroku addon:add custom_domains
+
+heroku domains:add example.com
+heroku domains:add www.example.com
+
+ +

DNS records

+ +
# Root domains
+mydomain.com. (A)
+  => 75.101.163.44
+  => 75.101.145.87
+  => 174.129.212.2
+
+# Subdomains
+.mydomain.com. (CNAME)
+  => proxy.heroku.com
+
+ +

Wildcard domains

+ +
heroku addons:add wildcard_domains
+
+*.yourdomain.com => heroku.com
+
+ + + + + + + + diff --git a/_output/html-css.html b/_output/html-css.html new file mode 100644 index 000000000..3338ecbb9 --- /dev/null +++ b/_output/html-css.html @@ -0,0 +1,45 @@ + + + + + + + + +

Html-css

+

CSS - Selectors

+ +
.class {
+}
+
+ +

CSS - Font styling

+ +
font-family: Arial;
+font-size: 12pt;
+line-height: 150%;
+color: #aa3322;
+
+ +

CSS - Font styling

+ +
// Bold
+font-weight: bold;
+font-weight: normal;
+
+// Italic
+font-style: italic;
+font-style: normal;
+
+// Underline
+text-decoration: underline;
+text-decoration: none;
+
+ + + + + + + + diff --git a/_output/html.html b/_output/html.html new file mode 100644 index 000000000..ce8d5582d --- /dev/null +++ b/_output/html.html @@ -0,0 +1,35 @@ + + + + + + + + +

HTML

+

H5BP HTML tag

+ +
<!--[if lt IE 7 ]> <html class="ie6"> <![endif]-->
+<!--[if IE 7 ]>    <html class="ie7"> <![endif]-->
+<!--[if IE 8 ]>    <html class="ie8"> <![endif]-->
+<!--[if IE 9 ]>    <html class="ie9"> <![endif]-->
+<!--[if (gt IE 9)|!(IE)]><!--> <html class=""> <!--<![endif]-->
+
+ +

iPhone viewport

+ +
<meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
+
+ +

Google jQuery

+ +
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
+
+ + + + + + + + diff --git a/_output/index.html b/_output/index.html new file mode 100644 index 000000000..ff3149a98 --- /dev/null +++ b/_output/index.html @@ -0,0 +1,115 @@ + + + + + + + + +

Cheat sheets

+ + + + + + + + + diff --git a/_output/ios.html b/_output/ios.html new file mode 100644 index 000000000..a13e14f0b --- /dev/null +++ b/_output/ios.html @@ -0,0 +1,31 @@ + + + + + + + + +

Ios

+

Path to Installous downloads:

+ +
/private/var/mobile/Documents/Installous/Downloads
+
+ +

Multiple Exchange accounts:

+ +
scp root@iphone.local:/private/var/mobile/Library/Preferences/com.apple.accountsettings.plist .
+
+ +

Ringtone conversion using ffmpeg:

+ +
ffmpeg -i foo.mp3 -ac 1 -ab 128000 -f mp4 -acodec libfaac -y target.m4r
+
+ + + + + + + + diff --git a/_output/jquery.html b/_output/jquery.html new file mode 100644 index 000000000..9cf50f312 --- /dev/null +++ b/_output/jquery.html @@ -0,0 +1,66 @@ + + + + + + + + +

jQuery

+

Extending selectors

+ +
// $(":inline")
+$.expr[':'].inline = function(a) {
+  return $(a).css('display') === 'inline';
+};
+
+ +

Extend CSS properties

+ +
$.cssHooks.someCSSProp = {
+  get: function(elem, computed, extra) {
+  },
+  set: function(elem, value) {
+  }
+};
+
+// Disable "px"
+$.cssNumber["someCSSProp"] = true;
+
+ +

fn.animate() hooks

+ +
$.fn.step.someWhatever = function(fx) {
+  // ...
+}
+
+ +

Mobile events

+ +

For support for tap, swipe, swipeLeft, et al, use +jquery.mobile.event.js. Be sure to set $.support.touch first.

+ +

To get $.support.touch (and family), use this from +jquery.mobile.support.js:

+ +
$.extend($.support, {
+  orientation: "orientation" in window && "onorientationchange" in window,
+  touch: "ontouchend" in document,
+  cssTransitions: "WebKitTransitionEvent" in window,
+  pushState: "pushState" in history && "replaceState" in history,
+  mediaquery: $.mobile.media( "only all" ),
+  cssPseudoElement: !!propExists( "content" ),
+  touchOverflow: !!propExists( "overflowScrolling" ),
+  boxShadow: !!propExists( "boxShadow" ) && !bb,
+  scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos && !operamini,
+  dynamicBaseTag: baseTagTest()
+});
+
+ + + + + + + + diff --git a/_output/linux.html b/_output/linux.html new file mode 100644 index 000000000..2e61940aa --- /dev/null +++ b/_output/linux.html @@ -0,0 +1,21 @@ + + + + + + + + +

Linux

+

Mounting a RAM drive

+ +
$ mount -t tmpfs -o size=5G,nr_inodes=5k,mode=700 tmpfs /tmp
+
+ + + + + + + + diff --git a/_output/makefile.html b/_output/makefile.html new file mode 100644 index 000000000..28d29b54c --- /dev/null +++ b/_output/makefile.html @@ -0,0 +1,47 @@ + + + + + + + + +

Makefile

+

Safe assignment

+ +
prefix ?= /usr/local
+
+ +

Cool stuff

+ +
    gitdir ?= $(shell git --exec-path)
+    gitver ?= $(word 3,$(shell git --version))
+
+ +

Substitutions

+ +
    $(SOURCE:.cpp=.o)
+    $(patsubst %.cpp, %.c, $(SOURCES))
+
+ +

Building files

+ +
    %.o: %.c
+        ffmpeg -i $< > $@   # Input and output
+        foo $^
+
+ +

Default task

+ +
    default:
+        @echo "hello."
+        @false
+
+ + + + + + + + diff --git a/_output/markdown.html b/_output/markdown.html new file mode 100644 index 000000000..6d5efce92 --- /dev/null +++ b/_output/markdown.html @@ -0,0 +1,29 @@ + + + + + + + + +

Markdown

+

Markdown

+ +
# h1
+### h3
+
+[link](http://google.com)
+
+[link][google]
+[google]: http://google.com
+
+![Image alt text](/path/to/img.jpg)
+
+ + + + + + + + diff --git a/_output/osx.html b/_output/osx.html new file mode 100644 index 000000000..ae6e0fe75 --- /dev/null +++ b/_output/osx.html @@ -0,0 +1,39 @@ + + + + + + + + +

Osx

+

Locations of startup items

+ +
/System/Library/LaunchAgents/
+/System/Library/LaunchDaemons/
+/Library/LaunchAgents/
+/Library/LaunchDaemons/
+
+ +

Hide desktop icons

+ +
defaults write com.apple.finder CreateDesktop -bool false
+killall Finder
+
+ +

Auto-hide other windows on dock switch

+ +
defaults write com.apple.dock single-app -bool TRUE
+killall Dock
+
+defaults delete com.apple.dock single-app
+killall Dock
+
+ + + + + + + + diff --git a/_output/passenger.html b/_output/passenger.html new file mode 100644 index 000000000..7765bb789 --- /dev/null +++ b/_output/passenger.html @@ -0,0 +1,25 @@ + + + + + + + + +

Phusion Passenger

+
server {
+   listen 80;
+   server_name www.yourhost.com;
+   root /somewhere/public;   # <--- be sure to point to 'public'!
+   passenger_enabled on;
+   autoindex on; # Show directory listings
+}
+
+ + + + + + + + diff --git a/_output/rails-models.html b/_output/rails-models.html new file mode 100644 index 000000000..d088f6080 --- /dev/null +++ b/_output/rails-models.html @@ -0,0 +1,324 @@ + + + + + + + + +

Rails Models

+

Generating models

+ +
$ rails g model User
+
+ +

Associations

+ +
belongs_to
+has_one
+has_many
+has_many :through
+has_one :through
+has_and_belongs_to_many
+
+belongs_to :author,
+  class_name: 'User',
+  dependent: :destroy  // delete this
+
+ +

Has many

+ +
belongs_to :parent, :foreign_key => 'parent_id' class_name: 'Folder'
+has_many :folders, :foreign_key => 'parent_id', class_name: 'Folder'
+
+has_many :comments,    :order      => "posted_on"
+has_many :comments,    :include    => :author
+has_many :people,      :class_name => "Person"
+has_many :people,      :conditions => "deleted = 0"
+has_many :tracks,      :order      => "position"
+has_many :comments,    :dependent  => :nullify
+has_many :comments,    :dependent  => :destroy
+has_many :tags,        :as         => :taggable
+has_many :reports,     :readonly   => true
+has_many :subscribers, :through    => :subscriptions, class_name: "User", :source => :user
+has_many :subscribers, :finder_sql =>
+    'SELECT DISTINCT people.* ' +
+    'FROM people p, post_subscriptions ps ' +
+    'WHERE ps.post_id = #{id} AND ps.person_id = p.id ' +
+    'ORDER BY p.first_name'
+
+ +

Many-to-many

+ +

If you have a join model:

+ +
class Programmer < ActiveRecord::Base
+  has_many :assignments
+  has_many :projects, :through => :assignments
+end
+
+class Project < ActiveRecord::Base
+  has_many :assignments
+  has_many :programmers, :through => :assignments
+end
+
+class Assignment
+  belongs_to :project
+  belongs_to :programmer
+end
+
+ +

Or HABTM:

+ +
has_and_belongs_to_many :projects
+has_and_belongs_to_many :projects, :include => [ :milestones, :manager ]
+has_and_belongs_to_many :nations, :class_name => "Country"
+has_and_belongs_to_many :categories, :join_table => "prods_cats"
+has_and_belongs_to_many :categories, :readonly => true
+has_and_belongs_to_many :active_projects, :join_table => 'developers_projects', :delete_sql =>
+"DELETE FROM developers_projects WHERE active=1 AND developer_id = #{id} AND project_id = #{record.id}"
+
+ +

Polymorphic associations

+ +
class Post
+  has_many :attachments, :as => :parent
+end
+
+class Image
+  belongs_to :parent, :polymorphic => true
+end
+
+ +

And in migrations:

+ +
create_table :images do
+  t.references :post, :polymorphic => true
+end
+
+ +

Migrations

+ +

Run migrations

+ +
$ rake db:migrate
+
+ +

Migrations

+ +
create_table :users do |t|
+  t.string :name
+  t.text   :description
+
+  t.primary_key :id
+  t.string
+  t.text
+  t.integer
+  t.float
+  t.decimal
+  t.datetime
+  t.timestamp
+  t.time
+  t.date
+  t.binary
+  t.boolean
+end
+
+options:
+  :null (boolean)
+  :limit (integer)
+  :default
+  :precision (integer)
+  :scale (integer)
+
+ +

Tasks

+ +
create_table
+change_table
+drop_table
+add_column
+change_column
+rename_column
+remove_column
+add_index
+remove_index
+
+ +

Associations

+ +
t.references :category   # kinda same as t.integer :category_id
+
+# Can have different types
+t.references :category, polymorphic: true
+
+ +

Add/remove columns

+ +
$ rails generate migration RemovePartNumberFromProducts part_number:string
+
+class RemovePartNumberFromProducts < ActiveRecord::Migration
+  def up
+    remove_column :products, :part_number
+  end
+
+  def down
+    add_column :products, :part_number, :string
+  end
+end
+
+ +

Validation

+ +
class Person < ActiveRecord::Base
+
+  # Checkboxes
+  validates :terms_of_service, :acceptance => true
+
+  # Validate associated records
+  has_many :books
+  validates_associated :books
+
+  # Confirmation (like passwords)
+  validates :email, :confirmation => true
+
+  # Format
+  validates :legacy_code, :format => {
+    :with    => /\A[a-zA-Z]+\z/,
+    :message => "Only letters allowed"
+  }
+
+  # Length
+  validates :name,     :length => { :minimum => 2 }
+  validates :bio,      :length => { :maximum => 500 }
+  validates :password, :length => { :in => 6..20 }
+  validates :number,   :length => { :is => 6 }
+
+  # Length (full enchalada)
+  validates :content, :length => {
+    :minimum   => 300,
+    :maximum   => 400,
+    :tokenizer => lambda { |str| str.scan(/\w+/) },
+    :too_short => "must have at least %{count} words",
+    :too_long  => "must have at most %{count} words"
+  }
+end
+
+  # Numeric
+  validates :points,       :numericality => true
+  validates :games_played, :numericality => { :only_integer => true }
+
+  # Non empty
+  validates :name, :presence => true
+
+  # Multiple
+  validate :login, :email, :presence => true
+end
+
+ +

Custom validations

+ +
class Person < ActiveRecord::Base
+  validate :foo_cant_be_nil
+
+  def foo_cant_be_nil
+    errors.add(:foo, 'cant be nil')  if foo.nil?
+  end
+end
+
+ +

API

+ +
items = Model.find_by_email(email)
+items = Model.where(first_name: "Harvey")
+
+item = Model.find(id)
+
+item.serialize_hash
+item.new_record?
+
+item.create     # Same an #new then #save
+item.create!    # Same as above, but raises an Exception
+
+item.save
+item.save!      # Same as above, but raises an Exception
+
+item.update
+item.update_attributes
+item.update_attributes!
+
+item.valid?
+item.invalid?
+
+ +

http://guides.rubyonrails.org/activerecordvalidations_callbacks.html

+ +

Mass updates

+ +
# Updates person id 15
+Person.update 15, name: "John", age: 24
+Person.update [1,2], [{name: "John"}, {name: "foo"}]
+
+ +

Joining

+ +
Student.joins(:schools).where(:schools => { :type => 'public' })
+Student.joins(:schools).where('schools.type' => 'public' )
+
+ +

Serialize

+ +
class User < ActiveRecord::Base
+  serialize :preferences
+end
+
+user = User.create(:preferences => { "background" => "black", "display" => large })
+
+ +

You can also specify a class option as the second parameter that’ll raise an +exception if a serialized object is retrieved as a descendant of a class not in +the hierarchy.

+ +
class User < ActiveRecord::Base
+  serialize :preferences, Hash
+end
+
+user = User.create(:preferences => %w( one two three ))
+User.find(user.id).preferences    # raises SerializationTypeMismatch
+
+ +

Overriding accessors

+ +
class Song < ActiveRecord::Base
+  # Uses an integer of seconds to hold the length of the song
+
+  def length=(minutes)
+    write_attribute(:length, minutes.to_i * 60)
+  end
+
+  def length
+    read_attribute(:length) / 60
+  end
+end
+
+ + + +

Callbacks

+ +
after_create
+after_initialize
+after_validation
+after_save
+after_commit
+
+ + + + + + + + diff --git a/_output/rails-plugins.html b/_output/rails-plugins.html new file mode 100644 index 000000000..940ecbe78 --- /dev/null +++ b/_output/rails-plugins.html @@ -0,0 +1,165 @@ + + + + + + + + +

Rails-plugins

+

Generate a plugin

+ +

Generate a Rails Engine plugin:

+ +
rails plugin new myplugin --skip-bundle --full
+
+ +

Initializers

+ + + +

Subclass Railtie and provide an initializer method.

+ +
module NewPlugin
+  class Railtie < Rails::Railtie
+    initializer "newplugin.initialize" do |app|
+
+      # subscribe to all rails notifications: controllers, AR, etc.
+      ActiveSupport::Notifications.subscribe do |*args|
+        event = ActiveSupport::Notifications::Event.new(*args)
+        puts "Got notification: #{event.inspect}"
+      end
+
+    end
+  end
+end
+
+ +

Custom routes

+ + + +

To create custom routes.rb keywords:

+ +
# # routes.rb:
+# myplugin_for x
+#
+class ActionDispatch::Routing
+  class Mapper
+    def myplugin_for(*x)
+    end
+  end
+end
+
+ +

Example with a block:

+ +
# authenticated do
+#   resources :users
+# end
+#
+def authenticated
+  constraint = lambda { |request| request... }
+
+  constraints(constraint) { yield }
+end
+
+ +

Custom generators

+ + + +

Basic

+ +
# rails g initializer
+# lib/generators/initializer_generator.rb
+class InitializerGenerator < Rails::Generators::Base
+  def create_initializer_file
+    create_file "config/initializers/initializer.rb", "# Add initialization content here"
+  end
+end
+
+ + + +

Generating a generator

+ +
$ rails generate generator initializer
+
+ +

NamedBase

+ +

Use NamedBase instead if you want to take an argument. It will be available as +file_name.

+ +
class InitializerGenerator < Rails::Generators::Base
+  def lol
+    puts file_name
+  end
+end
+
+ +

More

+ +
class InitializerGenerator < Rails::Generators::NamedBase
+  # 
+  source_root File.expand_path("../templates", __FILE__)
+  desc "Description goes here."
+end
+
+ +

Generators lookup

+ +

When invoking rails g XXX:

+ + + +

When invoking rails g XXX:YYY:

+ + + +

ActiveModel 'acts as'

+ +
# yaffle/lib/yaffle/acts_as_yaffle.rb
+module Yaffle
+  module ActsAsYaffle
+    extend ActiveSupport::Concern
+
+    included do
+    end
+
+    module ClassMethods
+      def acts_as_yaffle(options = {})
+        # your code will go here
+      end
+    end
+  end
+end
+
+ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle
+
+ + + + + + + + diff --git a/_output/rails-routes.html b/_output/rails-routes.html new file mode 100644 index 000000000..70fcc5ad3 --- /dev/null +++ b/_output/rails-routes.html @@ -0,0 +1,198 @@ + + + + + + + + +

Rails-routes

+

mapping

+ +

Guides/Routing

+ +

ActionDispatch::Routing::Mapper +(See included modules)

+ +

Multiple resources

+ +
resources :books
+# PhotosController:
+# index  =>    GET /photos
+# new    =>    GET /photos/new
+# create =>   POST /photos/new
+# show   =>    GET /photos/:id
+# edit   =>    GET /photos/:id/edit
+# update =>    PUT /photos/:id
+# delete => DELETE /photos/:id
+#
+# Helpers:
+# new_book_path
+# book_path(id)
+# edit_book_path(id)
+#
+
+resources :photos do
+  member { get 'preview' }       # /photo/1/preview
+  get 'preview', on: :member     # (..same as the first)
+  collection { get 'search' }    # /photos/search
+end
+
+ +

Single resource

+ +
resource :coder
+
+# CodersController:
+# new    =>    GET /coder/new
+# create =>   POST /coder/new
+# show   =>    GET /coder
+# edit   =>    GET /coder/edit
+# update =>    PUT /coder
+# delete => DELETE /coder
+
+ +

Matching

+ +
match 'photo/:id' => 'photos#show'  # /photo/what-is-it
+match 'photo/:id', id: /[0-9]+/     # /photo/0192
+match 'photo/:id' => 'photos#show', constraints: { id: /[0-9]+/ }
+match 'photo/:id', via: :get
+match 'photo/:id', via: [:get, :post]
+
+match 'photo/*path' => 'photos#unknown'    # /photo/what/ever
+
+# params[:format] == 'jpg'
+match 'photos/:id' => 'photos#show', :defaults => { :format => 'jpg' }
+
+ +

Redirection

+ +
match '/stories' => redirect('/posts')
+match '/stories/:name' => redirect('/posts/%{name}')
+
+ +

Named

+ +
# logout_path
+match 'exit' => 'sessions#destroy', as: :logout
+
+ +

Constraints

+ +
match '/', constraints: { subdomain: 'admin' }
+
+# admin.site.com/admin/photos
+namespace 'admin' do
+  constraints subdomain: 'admin' do
+    resources :photos
+  end
+end
+
+ +

Custom constraints

+ +
class BlacklistConstraint
+  def initialize
+    @ips = Blacklist.retrieve_ips
+  end
+
+  def matches?(request)
+    @ips.include?(request.remote_ip)
+  end
+end
+
+TwitterClone::Application.routes.draw do
+  match "*path" => "blacklist#index",
+    :constraints => BlacklistConstraint.new
+end
+
+ +

Scopes

+ +
scope 'admin', constraints: { subdomain: 'admin' } do
+  resources ...
+end
+
+ +

Rack middleware

+ +
# Yes, Sprockets is middleware
+match '/application.js' => Sprockets
+
+ +

Route helpers

+ +
projects_path   # /projects
+projects_url    # http://site.com/projects
+
+ +

Default help text

+ +
# The priority is based upon order of creation:
+# first created -> highest priority.
+
+# Sample of regular route:
+match 'products/:id' => 'catalog#view'
+
+# Keep in mind you can assign values other than :controller and :action
+
+# Sample of named route:
+match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
+
+# This route can be invoked with purchase_url(:id => product.id)
+
+# Sample resource route (maps HTTP verbs to controller actions automatically):
+resources :products
+
+# Sample resource route with options:
+resources :products do
+  member do
+    get 'short'
+    post 'toggle'
+  end
+
+  collection do
+    get 'sold'
+  end
+end
+
+# Sample resource route with sub-resources:
+resources :products do
+  resources :comments, :sales
+  resource :seller
+end
+
+# Sample resource route with more complex sub-resources
+resources :products do
+  resources :comments
+  resources :sales do
+    get 'recent', :on => :collection
+  end
+end
+
+# Sample resource route within a namespace:
+namespace :admin do
+  # Directs /admin/products/* to Admin::ProductsController
+  # (app/controllers/admin/products_controller.rb)
+  resources :products
+end
+
+# You can have the root of your site routed with "root"
+# just remember to delete public/index.html.
+root :to => 'welcome#index'
+
+# See how all your routes lay out with "rake routes"
+
+# This is a legacy wild controller route that's not recommended for RESTful applications.
+# Note: This route will make all actions in every controller accessible via GET requests.
+match ':controller(/:action(/:id(.:format)))'
+
+ + + + + + + + diff --git a/_output/rails.html b/_output/rails.html new file mode 100644 index 000000000..db7f6bf8d --- /dev/null +++ b/_output/rails.html @@ -0,0 +1,153 @@ + + + + + + + + +

Rails

+

Helpers

+ +
class ApplicationController
+  helper_method :logged_in?
+
+  def logged_in?
+    "Something"
+  end
+end
+
+ +

CSS/JS packages

+ +
stylesheet_link_tag :monkey
+javascript_link_tag :monkey
+
+ +

Forms

+ +
# http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html
+
+- form_for @person do |f|
+  = f.label :first_name
+  = f.label :first_name, "First name"
+  = f.text_field :first_name
+
+  = f.label :last_name>
+  = f.text_field :last_name>
+
+  - fields_for @person.permission do |fields|
+    = fields.checkbox :admin
+
+  -# name="person[admin]"
+  - fields_for :person, @client do |fields|
+    = fields.checkbox :admin
+
+  = f.submit
+
+# Also: check_box, email_field, fields_for
+# file_field, hidden_field, label, number_field, password_field
+# radio_button, range_field, search_field, telephonen_field,
+# text_area, text_field, url_field
+
+ +

Controllers

+ +

http://apidock.com/rails/ActionController/Base

+ +
class ProjectsController
+  layout 'project'   # Actually defaults to `projects` based
+                     # on the controller name
+
+  def save
+  end
+
+  def edit
+  end
+end
+
+ +

Before filter

+ +
class ApplicationController < ActionController::Base
+  before_filter :validate, only: [:save, :edit]
+  before_filter :ensure_auth, except: [:logout]
+
+  before_filter :require_login
+
+  private
+
+  def require_login
+    unless logged_in?
+      flash[:error] = "You must be logged in to access this section"
+      redirect_to new_login_url # halts request cycle
+    end
+  end
+end
+
+ +

Default URL optinos

+ +
class ApplicationController < ActionController::Base
+  # The options parameter is the hash passed in to 'url_for'
+  def default_url_options(options)
+    {:locale => I18n.locale}
+  end
+end
+
+ +

Hashes

+ +
session[:what]
+flash[:notice] = "Your session expired"
+params[:id]
+
+ +

XML and JSON

+ +
class UsersController < ApplicationController
+  def index
+    @users = User.all
+    respond_to do |format|
+      format.html # index.html.erb
+      format.xml  { render :xml => @users}
+      format.json { render :json => @users}
+    end
+  end
+end
+
+ +

Redirection

+ +
redirect_to action: 'show', id: @entry.id
+redirect_to root_url          # a path
+
+ +

Render

+ +
render nothing: true
+render template: 'products/show'
+render action: 'something'    # same as `file: 'my/something'`
+                              # Renders the template only, does not execute
+                              # the action
+
+ +

Layouts

+ +
# app/views/layouts/application.html.erb
+<%= content_for?(:content) ? yield :content : yield %>
+
+# app/views/layouts/news.html.erb
+<% content_for :content do %>
+   ...
+<% end %>
+<% render template: :'layouts/application' %>
+
+ + + + + + + + diff --git a/_output/rdoc.html b/_output/rdoc.html new file mode 100644 index 000000000..2c52d6ba1 --- /dev/null +++ b/_output/rdoc.html @@ -0,0 +1,43 @@ + + + + + + + + +

Rdoc

+

Basic RDoc format

+ +
# Foo.
+# 
+# @example
+#
+#   y
+#   g
+#
+# @param [String] param_name The xx and xx.
+#
+# @see http://url.com
+#
+# @return [true] if so
+#
+# == Definition lists
+#
+# list::  hi.
+# +foo+:: parameterized
+#
+# == Definition lists
+# [foo]   also
+# [bar]   like this
+
+ +

http://rdoc.rubyforge.org/RDoc/Markup.html

+ + + + + + + + diff --git a/_output/rst.html b/_output/rst.html new file mode 100644 index 000000000..8ee7e31b3 --- /dev/null +++ b/_output/rst.html @@ -0,0 +1,70 @@ + + + + + + + + +

ReStructuredText

+

Comments

+ +
.. @theme 2010
+.. include:: ../themes/2010/common.rst
+.. contents::
+.. |substitute| replace:: replacement name
+
+ +

Headings

+ +
Heading
+=======
+
+.. class:: brief
+
+Hello there. |substitute| **This is bold**
+
+
+ - Bullet list with a link_ (or `link with words`_)
+ - Yes
+
+.. _link: http://link.org
+
+ +

PDF page break

+ +
.. raw:: pdf
+
+   PageBreak oneColumn
+
+ +

Link targets

+ +
Internal link target_.
+
+.. _target:
+
+This is where _target will end up in.
+
+ +

Tables (?)

+ +
.. class:: hash-table
+
+.. list-table::
+
+   * - :key:`Weekly work hours:`
+     - :val:`50 hours`
+   * - :key:`Cost per hour:`
+     - :val:`PhP 1,500/hour`
+   * - :key:`Weekly rate:`
+     - :val:`PhP 75,000/week`
+
+ + + + + + + + diff --git a/_output/sequel.html b/_output/sequel.html new file mode 100644 index 000000000..8eabfb73b --- /dev/null +++ b/_output/sequel.html @@ -0,0 +1,412 @@ + + + + + + + + +

Sequel

+

Cheat Sheet

+

Open a database

+
+  require 'rubygems'
+  require 'sequel'
+
+  DB = Sequel.sqlite('my_blog.db')
+  DB = Sequel.connect('postgres://user:password@localhost/my_db')
+  DB = Sequel.postgres('my_db', :user => 'user', :password => 'password', :host => 'localhost')
+  DB = Sequel.ado('mydb')
+
+

Open an SQLite memory database

+

+Without a filename argument, the sqlite adapter will setup a new sqlite +database in memory. +

+
+  DB = Sequel.sqlite
+
+

Logging SQL statements

+
+  require 'logger'
+  DB = Sequel.sqlite '', :loggers => [Logger.new($stdout)]
+  # or
+  DB.loggers << Logger.new(...)
+
+

Using raw SQL

+
+  DB.run "CREATE TABLE users (name VARCHAR(255) NOT NULL, age INT(3) NOT NULL)"
+  dataset = DB["SELECT age FROM users WHERE name = ?", name]
+  dataset.map(:age)
+  DB.fetch("SELECT name FROM users") do |row|
+    p row[:name]
+  end
+
+

Create a dataset

+
+  dataset = DB[:items]
+  dataset = DB.from(:items)
+
+

Most dataset methods are chainable

+
+  dataset = DB[:managers].where(:salary => 5000..10000).order(:name, :department)
+
+

Insert rows

+
+  dataset.insert(:name => 'Sharon', :grade => 50)
+
+

Retrieve rows

+
+  dataset.each{|r| p r}
+  dataset.all # => [{...}, {...}, ...]
+  dataset.first # => {...}
+
+

Update/Delete rows

+
+  dataset.filter(~:active).delete
+  dataset.filter('price < ?', 100).update(:active => true)
+
+

Datasets are Enumerable

+
+  dataset.map{|r| r[:name]}
+  dataset.map(:name) # same as above
+
+  dataset.inject(0){|sum, r| sum + r[:value]}
+  dataset.sum(:value) # same as above
+
+

Filtering (see also doc/dataset_filtering.rdoc)

+

Equality

+
+  dataset.filter(:name => 'abc')
+  dataset.filter('name = ?', 'abc')
+
+

Inequality

+
+  dataset.filter{value > 100}
+  dataset.exclude{value <= 100}
+
+

Inclusion

+
+  dataset.filter(:value => 50..100)
+  dataset.where{(value >= 50) & (value <= 100)}
+
+  dataset.where('value IN ?', [50,75,100])
+  dataset.where(:value=>[50,75,100])
+
+  dataset.where(:id=>other_dataset.select(:other_id))
+
+

Subselects as scalar values

+
+  dataset.where('price > (SELECT avg(price) + 100 FROM table)')
+  dataset.filter{price > dataset.select(avg(price) + 100)}
+
+

LIKE/Regexp

+
+  DB[:items].filter(:name.like('AL%'))
+  DB[:items].filter(:name => /^AL/)
+
+

AND/OR/NOT

+
+  DB[:items].filter{(x > 5) & (y > 10)}.sql 
+  # SELECT * FROM items WHERE ((x > 5) AND (y > 10))
+
+  DB[:items].filter({:x => 1, :y => 2}.sql_or & ~{:z => 3}).sql 
+  # SELECT * FROM items WHERE (((x = 1) OR (y = 2)) AND (z != 3))
+
+

Mathematical operators

+
+  DB[:items].filter((:x + :y) > :z).sql 
+  # SELECT * FROM items WHERE ((x + y) > z)
+
+  DB[:items].filter{price - 100 < avg(price)}.sql 
+  # SELECT * FROM items WHERE ((price - 100) < avg(price))
+
+

Ordering

+
+  dataset.order(:kind)
+  dataset.reverse_order(:kind)
+  dataset.order(:kind.desc, :name)
+
+

Limit/Offset

+
+  dataset.limit(30) # LIMIT 30
+  dataset.limit(30, 10) # LIMIT 30 OFFSET 10
+
+

Joins

+
+  DB[:items].left_outer_join(:categories, :id => :category_id).sql 
+  # SELECT * FROM items LEFT OUTER JOIN categories ON categories.id = items.category_id
+
+  DB[:items].join(:categories, :id => :category_id).join(:groups, :id => :items__group_id) 
+  # SELECT * FROM items INNER JOIN categories ON categories.id = items.category_id INNER JOIN groups ON groups.id = items.group_id
+
+

+ +

+

Aggregate functions methods

+
+  dataset.count #=> record count
+  dataset.max(:price)
+  dataset.min(:price)
+  dataset.avg(:price)
+  dataset.sum(:stock)
+
+  dataset.group_and_count(:category)
+  dataset.group(:category).select(:category, :AVG.sql_function(:price))
+
+

SQL Functions / Literals

+
+  dataset.update(:updated_at => :NOW.sql_function)
+  dataset.update(:updated_at => 'NOW()'.lit)
+
+  dataset.update(:updated_at => "DateValue('1/1/2001')".lit)
+  dataset.update(:updated_at => :DateValue.sql_function('1/1/2001'))
+
+

Schema Manipulation

+
+  DB.create_table :items do
+    primary_key :id
+    String :name, :unique => true, :null => false
+    TrueClass :active, :default => true
+    foreign_key :category_id, :categories
+    DateTime :created_at
+    
+    index :created_at
+  end
+
+  DB.drop_table :items
+
+  DB.create_table :test do
+    String :zipcode
+    enum :system, :elements => ['mac', 'linux', 'windows']
+  end
+
+

Aliasing

+
+  DB[:items].select(:name.as(:item_name))
+  DB[:items].select(:name___item_name)
+  DB[:items___items_table].select(:items_table__name___item_name)
+  # SELECT items_table.name AS item_name FROM items AS items_table
+
+

Transactions

+
+  DB.transaction do
+    dataset.insert(:first_name => 'Inigo', :last_name => 'Montoya')
+    dataset.insert(:first_name => 'Farm', :last_name => 'Boy')
+  end # Either both are inserted or neither are inserted
+
+

+Database#transaction is re-entrant: +

+
+  DB.transaction do # BEGIN issued only here
+    DB.transaction
+      dataset << {:first_name => 'Inigo', :last_name => 'Montoya'}
+    end
+  end # COMMIT issued only here
+
+

+Transactions are aborted if an error is raised: +

+
+  DB.transaction do
+    raise "some error occurred"
+  end # ROLLBACK issued and the error is re-raised
+
+

+Transactions can also be aborted by raising Sequel::Rollback: +

+
+  DB.transaction do
+    raise(Sequel::Rollback) if something_bad_happened
+  end # ROLLBACK issued and no error raised
+
+

+Savepoints can be used if the database supports it: +

+
+  DB.transaction do
+    dataset << {:first_name => 'Farm', :last_name => 'Boy'} # Inserted
+    DB.transaction(:savepoint=>true) # This savepoint is rolled back
+      dataset << {:first_name => 'Inigo', :last_name => 'Montoya'} # Not inserted
+      raise(Sequel::Rollback) if something_bad_happened
+    end
+    dataset << {:first_name => 'Prince', :last_name => 'Humperdink'} # Inserted
+  end
+
+

Miscellaneous:

+
+  dataset.sql # "SELECT * FROM items"
+  dataset.delete_sql # "DELETE FROM items"
+  dataset.where(:name => 'sequel').exists # "EXISTS ( SELECT * FROM items WHERE name = 'sequel' )"
+  dataset.columns #=> array of columns in the result set, does a SELECT
+  DB.schema(:items) => [[:id, {:type=>:integer, ...}], [:name, {:type=>:string, ...}], ...]
+
+

Documents

+
+  http://sequel.rubyforge.org/rdoc/files/doc/association_basics_rdoc.html
+  http://sequel.rubyforge.org/rdoc/classes/Sequel/Schema/Generator.html
+  http://sequel.rubyforge.org/rdoc/files/doc/validations_rdoc.html
+  http://sequel.rubyforge.org/rdoc/classes/Sequel/Model.html
+
+

Alter table

+
+  database.alter_table :deals do
+    add_column :name, String
+    drop_column :column_name
+    rename_column :from, :to
+
+    add_constraint :valid_name, :name.like('A%')
+    drop_constraint :constraint
+
+    add_full_text_index :body
+    add_spacial_index [columns]
+
+    add_index :price
+    drop_index :index
+
+    add_foreign_key :artist_id, :table
+    add_primary_key :id
+    add_unique_constraint [columns]
+    set_column_allow_null :foo, false
+    set_column_default :title, ''
+
+    set_column_type :price, 'char(10)'
+  end
+
+

Model associations

+
+  class Deal < Sequel::Model
+
+    # Us (left) <=> Them (right)
+    many_to_many  :images,
+      left_id:    :deal_id,
+      right_id:   :image_id,
+      join_table: :image_links
+
+    one_to_many   :files,
+      key:        :deal_id,
+      class:      :DataFile,
+
+    many_to_one   :parent, class: self
+    one_to_many   :children, key: :parent_id, class: self
+
+    one_to_many :gold_albums, class: :Album do |ds|
+      ds.filter { copies_sold > 50000 }
+    end
+
+

+Provided by many_to_many +

+
+  Deal[1].images
+  Deal[1].add_image
+  Deal[1].remove_image
+  Deal[1].remove_all_images
+
+

Validations

+
+    def validate
+      super
+      errors.add(:name, 'cannot be empty') if !name || name.empty?
+
+      validates_presence [:title, :site]
+      validates_unique :name
+      validates_format /\Ahttps?:\/\//, :website, :message=>'is not a valid URL'
+      validates_includes %w(a b c), :type
+      validates_integer :rating
+      validates_numeric :number
+      validates_type String, [:title, :description]
+
+      validates_integer :rating  if new?
+
+      # options: :message =>, :allow_nil =>, :allow_blank =>,
+      #          :allow_missing =>,
+
+      validates_exact_length 17, :isbn
+      validates_min_length 3, :name
+      validates_max_length 100, :name
+      validates_length_range 3..100, :name
+      
+      # Setter override
+      def filename=(name)
+        @values[:filename] = name
+      end
+    end
+  end
+
+  deal.errors
+
+

Model stuff

+
+  deal = Deal[1]
+  deal.changed_columns
+  deal.destory  # Calls hooks
+  deal.delete   # No hooks
+  deal.exists?
+  deal.new?
+  deal.hash  # Only uniques
+  deal.keys  #=> [:id, :name]
+  deal.modified!
+  deal.modified?
+
+  deal.lock!
+
+

Callbacks

+
+  before_create
+  after_create
+
+  before_validation
+  after_validation
+  before_save
+  before_update
+  UPDATE QUERY
+  after_update
+  after_save
+
+  before_destroy
+  DELETE QUERY
+  after_destroy
+
+

Schema

+
+  class Deal < Sequel::Model
+    set_schema do
+      primary_key :id
+      primary_key [:id, :title]
+      String :name, primary_key: true
+      
+      String  :title
+      Numeric :price
+      DateTime :expires
+
+      unique :whatever
+      check(:price) { num > 0 }
+
+      foreign_key :artist_id
+      String :artist_name, key: :id
+
+      index :title
+      index [:artist_id, :name]
+      full_text_index :title
+
+      # String, Integer, Fixnum, Bignum, Float, Numeric, BigDecimal,
+      # Date, DateTime, Time, File, TrueClass, FalseClass
+    end
+  end
+
+

Unrestrict primary key

+
+  Category.create id: 'travel'   # error
+  Category.unrestrict_primary_key
+  Category.create id: 'travel'   # ok
+
+ + + + + + + + diff --git a/_output/style.css b/_output/style.css new file mode 100644 index 000000000..4a0b74bf0 --- /dev/null +++ b/_output/style.css @@ -0,0 +1 @@ +body{font-family:"pt sans",sans-serif;font-size:14px;line-height:1.5}html{background:#505060}body{width:800px;margin:20px auto;padding:20px;-moz-border-radius:2px;-webkit-border-radius:2px;-o-border-radius:2px;-ms-border-radius:2px;-khtml-border-radius:2px;border-radius:2px;-moz-box-shadow:0 2px 3px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.2);-o-box-shadow:0 2px 3px rgba(0,0,0,0.2);box-shadow:0 2px 3px rgba(0,0,0,0.2);background:#fafafa;color:#333}p,ul,ol,pre{margin:15px 0}h1,h2,h3,h4,h5,h6{margin:40px 0 15px 0}h1{font-family:georgia,serif;text-align:center;font-size:24pt;color:#aaa;font-style:italic;font-weight:normal;margin:10px 0;padding:10px 0;border-bottom:dotted 1px #ddd;border-top:dotted 1px #ddd}h2,h3{color:#88a;font-size:1.5em;border-bottom:solid 1px #ddd;padding-bottom:3px}h3{font-size:1.3em}pre,code{font-family:monaco,monospace;font-size:12px;color:#444}pre{line-height:1.6;background:#f7f7f2;padding:10px 35px;-moz-box-shadow:inset 0 0 5px rgba(0,0,0,0.1);-webkit-box-shadow:inset 0 0 5px rgba(0,0,0,0.1);-o-box-shadow:inset 0 0 5px rgba(0,0,0,0.1);box-shadow:inset 0 0 5px rgba(0,0,0,0.1);overflow-x:auto;margin-left:-20px;margin-right:-20px}h2 + pre,h3 + pre{border-top:solid 2px #c0c0dd;margin-top:-16px}ul.pages,ul.pages li{margin:0;padding:0;list-style-type:none}ul.pages{overflow:hidden;margin:40px 0}ul.pages li{width:20%;float:left}ul.pages a{display:block;text-decoration:none;padding:2px 5px;-moz-border-radius:3px;-webkit-border-radius:3px;-o-border-radius:3px;-ms-border-radius:3px;-khtml-border-radius:3px;border-radius:3px}ul.pages a:hover{background:#eee}ul.pages li:first-letter{text-transform:uppercase}.str{color:#080}.kwd{color:#008}.com{color:#7bd;text-shadow:1px 1px 0 rgba(255,255,255,0.3)}.typ{color:#606}.lit{color:#066}.pun{color:#660}.pln{color:#000}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec{color:#606}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}@media print{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}} diff --git a/_output/textile.html b/_output/textile.html new file mode 100644 index 000000000..be591472a --- /dev/null +++ b/_output/textile.html @@ -0,0 +1,83 @@ + + + + + + + + +

Textile

+

Pre blocks

+ +
<pre>
+I am <b>very serious.</b> -- this will get escaped.
+</pre>
+
+ +

Line breaks

+ +
Line breaks.
+Just break the lines.
+
+ +

Entities

+ +
one(TM), two(R), three(C).
+
+ +

Inlines

+ +
_em_ *strong* __bold-italic__. ??citation??.
+@code@. -strikehtrough-. +insertion+.
+%span%. %{color:red}formatting%.
+"Hypertext":index.html
+"Text link":link
+
+[link]http://link.com
+
+!image.jpg!
+!image.jpg(title text)!
+!image.jpg!:link.html
+
+!>right.jpg!
+
+ +

Horizontal line

+ +
--
+
+ +

Blocks

+ +
h1. Header 1
+
+h2. Header 2
+
+bq. Blockquote
+
+p(classname). Class.
+
+p(#id). ID.
+
+ +

Lists

+ +
## ordered list
+
+* unordered list
+
+ +

Footnotes

+ +
Footnotes[1].
+
+fn1. Something.
+
+ + + + + + + + diff --git a/_output/tig.html b/_output/tig.html new file mode 100644 index 000000000..1aafa8ef6 --- /dev/null +++ b/_output/tig.html @@ -0,0 +1,54 @@ + + + + + + + + +

Tig

+

Tig shortcuts

+ +

Invocation

+ +
tig blame FILE
+tig master        # Show a branch
+tig test..master  # Show difference between two bracnhes
+tig FILE          # Show history of file
+tig v0.0.3:README # Show contents of file in a specific revision
+
+ +

All views

+ + + +

m - Main view + * D - Toggle between date display modes + * A - Toggle between author display modes + * C - Cherry pick a commit

+ +

S - Stage view

+ + + +

H - Branch view

+ + + + + + + + + + diff --git a/_output/tmux.html b/_output/tmux.html new file mode 100644 index 000000000..dfd8f5940 --- /dev/null +++ b/_output/tmux.html @@ -0,0 +1,73 @@ + + + + + + + + +

tmux Terminal Multiplexer

+

Commands

+ +
$ tmux
+  -u        # UTF8 mode
+  -S ~/.tmux.socket
+
+$ tmux attach
+
+ +

Help

+ +
C-b ?
+
+ +

Scrolling

+ +
C-b [       # Enter scroll mode then press up and down
+
+ +

Copy/paste

+ +
C-b [       # 1. Enter scroll mode first.
+Space       # 2. Start selecting and move around.
+Enter       # 3. Press enter to copy.
+C-b ]       # Paste
+
+ +

Panes

+ +
C-b v       # vert
+C-b n       # horiz
+C-b hkjl    # navigation
+C-b HJKL    # resize
+C-b o       # next window
+C-b x       # close pane
+
+C-b { or }  # move windows around
+
+ +

Windows

+ +
C-b c       # New window
+C-b 1       # Go to window 1
+
+ +

Detach/attach

+ +
C-b d       # detatch
+C-b ( )     # Switch through sessions
+$ tmux attach
+
+ +

Niceties

+ +
C-b t    # Time
+
+ + + + + + + + diff --git a/_output/ubuntu.html b/_output/ubuntu.html new file mode 100644 index 000000000..12da20b8d --- /dev/null +++ b/_output/ubuntu.html @@ -0,0 +1,29 @@ + + + + + + + + +

Ubuntu/Debian

+

Aptitude stuff

+ +
aptitude search mysql       # Look for something
+dpkg -S `which tsclient`    # What package does it belong to?
+dpkg -L aria2c              # What does this package provide?
+dpkg -i *.deb               # Install a deb file
+
+ +

Apt archives path

+ +
/var/cache/apt/archives
+
+ + + + + + + + diff --git a/_output/unicode.txt b/_output/unicode.txt new file mode 100644 index 000000000..57bfcf6db --- /dev/null +++ b/_output/unicode.txt @@ -0,0 +1,19 @@ + ▲▼▶ + + ⬅⬆⬇ + + ◢ ◣ ◤ ◥ + + : «» XOR ‹›, (), [], •, ⌘, ⌥, ▲▼, ▸▹, ◇ XOR ◆, ◐◑◒◓ ◢ ◣ ◤ ◥, ★ ☆ , ♠♥♣♦, ⚐⚑, ✂ + + + ࣾ home ࣾ + ℹ information ℹ + ♡ heart ♡ + ⚙ cog or gear ⚙ + ⚿ key ⚿ + ✉ envelope ✉ + ✎ pencil ✎ + ✓ check or tick mark ✓ + ❌ cross mark ❌ + 💬 speech balloon 💬 diff --git a/_output/vim.html b/_output/vim.html new file mode 100644 index 000000000..e49eef365 --- /dev/null +++ b/_output/vim.html @@ -0,0 +1,50 @@ + + + + + + + + +

vim

+
.    - repeat last command
+]p   - paste under the current indentation level
+
+ +

Motions

+ +
vip           - Select paragraph
+vipipipip     - Select more
+
+ap            - a paragraph
+ip            - inner paragraph
+
+{a,i}p        - Paragraph
+{a,i}w        - Word
+{a,i}s        - Sentence
+
+ab            - A block [(
+aB            - A block in [{
+at            - A XML tag block
+a[ ( { <      - A [], (), or {} block
+a' " `        - A quoted string
+
+ +

Example:

+ +
yip - Yank inner paragraph
+yap - Yank paragraph (including newline)
+
+ +

SCSS!

+ +
va{=     - reindent block
+
+ + + + + + + + diff --git a/_output/zsh.html b/_output/zsh.html new file mode 100644 index 000000000..de56266d7 --- /dev/null +++ b/_output/zsh.html @@ -0,0 +1,36 @@ + + + + + + + + +

ZSH

+

Stuff

+ +
!!                  Last command (sudo !!)
+
+!*                 Last command's parameters (vim !*)
+!^                 Last command's first parameter
+!$                 Last command's last parameter
+
+!?ls<tab>          Command and params of last `ls` command (sudo !?mv<tab>)
+!?ls?:*<tab>       Params of last `ls` command
+
+*(m0)              Last modified today
+*(m-4)             Last modified <4 days ago
+
+ +

Change default shell

+ +
chsh -s `which zsh`
+
+ + + + + + + + diff --git a/rails-routes.md b/rails-routes.md index 6b5d52603..6f3a0853a 100644 --- a/rails-routes.md +++ b/rails-routes.md @@ -55,6 +55,16 @@ mapping # params[:format] == 'jpg' match 'photos/:id' => 'photos#show', :defaults => { :format => 'jpg' } +### Get/post + +`get` is the same as `match via: :get`. + + get 'photo/:id' => 'photos#show' + # same as match 'photo/:id' => 'photos#show', via: :get + + post 'photo/:id' => 'photos#update' + # same as match 'photo/:id' => 'photos#show', via: :post + ### Redirection match '/stories' => redirect('/posts')