Freenerd
Learning Ruby & Rails
Require custom gems in development

When developing you often come about a part in a gem you want to change. You will fork the gem and/or create a pull request later. But for testing, you often want to see how your change performs locally int he context of your project first.

So you locally clone the gem, start making your changes. To integrate, use this code:

$LOAD_PATH << 'local/path/to/gem/lib'
require 'gemname.rb'

For example in Rails you can put it in your `application.rb`. Also uncomment the orginal gem in your Gemfile. Once you are happy with your changes, push them to Github. To use the with bundler, put this in your Gemfile:

#gem 'gemname'
gem 'gemname', :git => 'git://github.com/user/gemname.git', :branch => 'your_branch'

Note: Your git repository has to be publicly accessible.

Scrolling in screen

In GNU screen you can’t use the normal terminal scrolling. One way to still retrieve your history is by switching into copy mode via

C-a [ or  C-a ESC

You can then use the arrow or movement keys

h j k l

for scrolling. Exit with ESC. Yay.

Disable logger in Rails & Rspec

Parts of my Rails code have a good portion of logging code, because I want to observe it’s behavior closely in the real world. I will probably remove the logging code, once I’m confident enough with the code

But during testing these log lines distract me from the test results and hide other stuff. So I decided it is better to disable it. I did this by adding the following code to /config/environments/test.rb

# disable logger
class EmptyLogger < StringIO
  def write(input)
    # do nothing
  end
end
config.logger = Logger.new(EmptyLogger.new)

This writes all log messages to a StringIO object, which does nothing with it …

Pretty JSON with curl

When using curl to call REST APIs returning JSON, it is often hard to see the structure of the response. We need to prettify that! Fortunately, the Ruby json gem has a script called “prettify_json.rb”, that we can just pipe JSON to. Awesome.

Install the json gem

gem install json

Use it

$ curl "http://api.soundcloud.com/users/4126.json" | prettify_json.rb

{
  "id": 4126,
  "permalink": "diskodna",
  "username": "DiskoDNA",
  ...
  "website": "http://www.diskodna.de",
  "website_title": null,
  "online": false,
  "track_count": 11,
  "followers_count": 545,
  "followings_count": 311,
  "public_favorites_count": 93
}
Screen

When working remote via SSH, you often want to make sure that your processes continue to run, even if your connection dies. Screen is the tool for that. It creates shell sessions, that are detached from your terminal session. Thus they run, without you being connected. Also different users can share screen sessions with each other.

This are some of the basic commands:

Open a new screen session

screen

Get out of a running screen session (detach from terminal)

screen -d
C-a C-D

What screen sessions are already there?

screen -list

If there already is one, let’s open that (attach it to your current terminal session)

screen -r

Or specify the screen to open

screen -r [sessionowner]/[pid.tty.host]

Read more on the screen man page

man screen
Another tip, put this in your ~/.screenrc to have a footer displaying all open screens:
caption always "%{kg}%?%-Lw%?%{bw}%n*%f %t%?(%u)%?%{kr}%?%+Lw%?"
Keys in Ruby Hashes are Case Sensitive

> a = {}
 => {} 
> a['content-type'] = "My first string"
 => "My first string" 
> a['Content-Type'] = "My second string"
 => "My second string" 
> a
 => {"content-type"=>"My first string",
     "Content-Type"=>"My second string"} 

Avoid clutter in irb

When using irb, the prompt might get cluttered bad, if you handle huge objects, since irb always returns the last object. To clean this up, just append ; nil to your input. This will return nil, since it is the last object.

Cluttered:

> numbers = (1..1000).collect { |i| i }
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152,
153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176,
177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212,
213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236,
237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248,
249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272,
273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296,
297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320,
321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332,
333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344,
345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356,
357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368,
369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380,
381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392,
393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404,
405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416,
417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428,
429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440,
441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452,
453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464,
465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476,
477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488,
489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500,
501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512,
513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524,
525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536,
537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548,
549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560,
561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572,
573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584,
585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596,
597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608,
609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620,
621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632,
633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644,
645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656,
657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668,
669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680,
681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692,
693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704,
705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716,
717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728,
729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740,
741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752,
753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764,
765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776,
777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788,
789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800,
801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812,
813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824,
825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836,
837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848,
849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860,
861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872,
873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884,
885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896,
897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908,
909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920,
921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932,
933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944,
945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956,
957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968,
969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980,
981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992,
993, 994, 995, 996, 997, 998, 999, 1000]

Uncluttered:

> numbers = (1..1000).collect { |i| i }; nil
 => nil 
(I am aware that this example is a bit crappy, but nevermind)
See surrounding lines in grep

When you search for something with grep, you sometimes need some context for the search results. Use the following arguments for that:

grep -B 2 foo bar.txt # 2 lines before every match
grep -A 3 foo bar.txt # 3 lines after every match
grep -C 1 foo bar.txt # 1 line before and after every match
grep -n 1 foo bar.txt # 1 line before and after every match

Compare View on Github

GitHub has introduced compare view about half a year ago. It basically is a nice frontend to git diff. You can specify a start and an end point for the diff. This can be commit hashes, tag or branch names:

http://github.com/<USER>/<REPO>/compare/[<START>...]<END>
For example, this is everything that happened between some commit a the current master branch in the Browsemytweets repository. We are using this view for code reviews. Once a feature in a topic branch is done, we sit down together on one computer and go through the diff. The Github view is nicer than the plain-text diff and even includes comments made on github throughout the way … The only thing missing is doing new comments in compare view …