Asset pipeline: Precompile non-standard manifests
By default, only application.js
, application.css
and all non-JS/CSS files are precompiled into public/assets
.
If you have asset manifests in non-standard locations, declare them in your config/application.rb
:
config.assets.precompile += ['application/all.css', 'result/all.css', 'application/all.js', 'result/all.js']
This way you can also precompile files that do not have any manifest.
Beware ruby's var1 = var2 = "value" multiple assignment
This looks like it is safe to use:
2.2.1 :001 > a = b = "hello world"
"hello world"
2.2.1 :002 > a
"hello world"
2.2.1 :003 > b
"hello world"
2.2.1 :004 > b = " goodbye!"
" goodbye!"
2.2.1 :005 > a
"hello world"
2.2.1 :006 > b
" goodbye!"
But it isn't!
2.2.1 :010 > a = b = "hello world"
"hello world"
2.2.1 :011 > a
"hello world"
2.2.1 :012 > b
"hello world"
2.2.1 :013 > b << " goodbye!"
"hello world goodbye!"
2.2.1 :014 > a
"hello world goodbye!"
2.2.1 :015 > b
"hello world goodbye!"
What is happening when we do `a = b = ...
Upgrade from Ruby 1.8.7 to 2.1.5 – an incomplete guide
I recommend to go straight to 2.1.5+
without intermediate steps. Otherwhise you burden yourself with unnecessary work of encoding problems.
Issues you may encounter:
- Set the ruby version within your
.ruby-version
file to2.1.5
- Remove gem
ruby-debug
and use e.g.byebug
- Remove gem
oniguruma
- Remove gem
fastercsv
- Replace gem
mysql
withmysql2
- Update gem capistrano
2.12.0
to~>2.12
when bound forRuby 1.8.7
and remove obsolete explicite Gemfile entries fornet-scp
andnet-ssh
if present. - Update gem `and...
You can now override all Spreewald steps with more specific versions
You can now define this step without Cucumber raising Cucumber::Ambiguous
:
Then /^I should see "whatever I want"$/ do
...
end
This is available in Spreewald 1.5.0+.
Override Cucumber steps without an ambiguity error
Cucumber raises a Cucumber::Ambiguous
if more than one step definitions match a step.
Our new cucumber_priority gem provides a way to mark step definitions as overridable, meaning that they can always be overshadowed by a more specific version without raising an error.
This gem is currently used by spreewald and cucumber_factory.
Marking step definiti...
Spreewald: Click on an element with a CSS selector
Spreewald 1.4.0 comes with this step:
When I click on the element ".sidebar"
We recommend to define a selector_for
method in features/support/selectors.rb
so you can refer to the selector in plain English:
When I click on the element for the sidebar
start tcpdump log on high traffic
Logging tcpdump output all the time can create a huge amount of data. This can be both: too much data size on HDD and tiring to analyze. You can run a script in a screen which checks out the packages transfered per second and start a tcpdump when the packages exceed a fixed number.
#!/usr/bin/env bash
interface=eth0
dumpdir=/tmp/
packet_threshold=5000
log_packets=100000
while /bin/true; do
pkt_old=`grep $interface: /proc/net/dev | cut -d : -f2 | awk '{ print $2 }'`
sleep 1
pkt_new=`grep $interface: /proc/net/dev | cut -d : -f...
Spreewald: Check that a CSS selector is present on the current page
Spreewald 1.3.0 comes with these steps:
Then I should see an element ".panel"
Then I should not see an element ".sidebar"
Then I should see an element ".twitter-timeline"
We recommend to define a selector_for
method in features/support/selectors.rb
so you can refer to the selector in plain English:
Then I should see an element for a panel
Then I should not see an element for the sidebar
Then I should see an element for the Twitter timeline
Using the Bash in VI mode
Activate VI
mode by running
set -o vi
Now use your Bash as if it were VI! Hit Esc
to enter command mode, jump around with e
, w
, b
, 0
, $
etc. and edit just as you're used to.
Bash history is searched with /
. See the linked cheat sheet for more hints.
Class: RubyVM::InstructionSequence (Ruby 2.0.0)
This class contains nerdcore things such as disassembling a piece of Ruby into VM calls or enabling tail-call optimization.
Also see this article about enabling TCO on a per-method basis.
Adjust cron jobs to allow full backtraces for rake tasks
As we get an exception notification, when a cron job fails, we wish to have the full backtrace in this mail. A rake task doesn't output the full backtrace by default, so you need the --backtrace
option.
Trigger
You will find fail mails with a shortened backtrace
#[...]
Tasks: TOP => some_namespace:some_task
(See full trace by running task with --trace)
What rake wants from you
Running the rake task like rake some_namespace:some_task --backtrace
How this works with whenever
Define a own job_type and use it for r...
Git: Issues with Gemfile.lock
When there's a Gemfile.lock
in your working directory that you cannot remove by either checkout
, reset [--hard]
, stash
, probably Rails' Spring is the culprit and not Bundler itself.
Fix
spring stop
The author of the linked Stackoverflow post supposes Spring re-writes the Gemfile.lock
on change to ensure all Spring processes are using the same gem versions. Meh.
Instant Markdown previews from Vim
Live markdown previewer (with Github flavored syntax) for VIM.
Will open a preview in your browser and update automatically on each key press.
Exclusive cronjobs with flock and whenever
I had a very frequent cronjob that in rare cases could be relatively slow. To avoid multiple instances of this cronjob running in parallel, I decided to use flock
to ensure that only one instance could run at a time.
flock
works by acquiring a lock to a file, and if it can do so running a command. In order not to wait but simply give up when the file is locked, you can add -n
:
flock /tmp/my.task.lock -n -c "bin/my-long-running-job"
Using whenever, and since this was a rake task, the follo...
MutationObserver
MutationObserver
provides developers a way to react to changes in a DOM. Any: insertion, deletion, attribute change – anything.
Quickstart: https://davidwalsh.name/mutationobserver-api
Relevant caniuse.com search: http://caniuse.com/#feat=mutationobserver
ne, the nice editor
Command line text editor with syntax highlighting, menus (F1
), etc.
This might be a worthy replacement for nano
if you don't want to use vim
.
How to fix: RubyMine occasionally no longer accepts keyboard input
From time to time, RubyMine suddenly did not accept any keyboard input and felt crashed, while mouse interaction was still possible. This apparently happens to all IntelliJ IDEs, especially on Ubuntu 14.04.
I've managed to fix it by having a shell script that exports XMODIFIERS=""
when launching RubyMine, like this:
#!/bin/sh
XMODIFIERS= /home/arne/rubymine/bin/rubymine.sh
It has been working reliably for me ever since, at least until RubyMine 8.
An alternate solution suggested on the [Jetbrains issue tracker](https://youtrack....
CSS Fontstack: An overview of web/web safe font support
Web safe fonts are fonts that are pre-installed by many operating systems. While not all systems have the same fonts installed, you can use a web safe font stack to choose several fonts that look similar, and are installed on the various systems that you want to support. If you want to use fonts other than ones pre-installed, as of CSS3, you can use Web Fonts.
If you need to install any of the widely-supported fonts listed there, you'll probably find them at www.fontpalace.com.
Case Study: Analyzing Web Font Performance
Table of contents of the linked article:
What are Web Fonts?
- Advantages of Web Fonts
- Disadvantages of Web Fonts
- Fallback Fonts
- CSS3 @font Declaration Example
- Fallback Font Example
- Render Blocking and Critical Rendering Path
- FOIT
Optimizing Web Font Delivery Further
- Prioritize Based On Browser Support
- Choose Only Styles You Need
- Character Sets
- Host Fonts Locally or Prefetch
- Store in LocalStorage with Base64 Encoding
- Another Method
Web Font Pe...
IFrame Resizer
A JS library that allows you to embed an iframe that automatically shrinks or expands to match its content.
(Untried.)
get haproxy stats/informations via socat
You can configure a stat socket for haproxy in the global section of the configuration file:
global
daemon
maxconn 999
user foobar
stats socket /var/run/haproxy.stat # this is the line you want to configure
You need socat
to query data from this socket.
After installing socat and reconfiguring haproxy you can use this socket to query data from it:
-
show informations like haproxy version, PID, current connections, session rates, tasks, etc..
echo "show info" | socat unix-connect:/var/run/haproxy.stat stdio
...
what to do if nova's iptables rules are missing
After restarting an OpenStack host you may encouter problems with missing iptables rules (we're on an quite old release of OpenStack currently. Maybe this is fixed in newer releases). The nova chains appear in the iptables -L
output but they're empty. NAT is working fine. The reason is, that the NAT chains are configured by nova-network
while the filter rules are managed by nova-compute
. I didn't manage to find the cause of this behaivour yet, but I think it has something to do with the start order of the nova services. (When `nova-net...
ping with timestamps
Use this snippet by Achu from Ask Ubuntu:
ping hostname.tld | while read pong; do echo "$(date): $pong"; done
This gives you lines like:
Wed Nov 4 10:32:31 CET 2015: 64 bytes from 1.2.3.4: icmp_seq=298 ttl=61 time=0.673 ms
Wed Nov 4 10:32:32 CET 2015: 64 bytes from 1.2.3.4: icmp_seq=299 ttl=61 time=0.616 ms
Wed Nov 4 10:32:33 CET 2015: 64 bytes from 1.2.3.4: icmp_seq=300 ttl=61 time=1.04 ms
How to deal with "invalid %-encoding" error in application for malformed uri
Lead by a discussion of this issue, I built in a middleware which answers those requests with [400] bad request
rather than raising an ArgumentError
.
I put it into app/util
and configured application.rb
like that:
# catches 'invalid %-encoding' error
require "#{Rails.root}/app/util/exception_app"
config.middleware.insert_before Rack::Runtime, ExceptionApp::Middleware
Note: Rails 4.2+ raises an ActionController::BadRequest
error instead of an ArgumentError
.