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.
(Source: saltycrane.com)
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 …
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
}
(Source: stackoverflow.com)
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 screenAnother 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%?"
(Source: gnu.org)
> 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"}
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)
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
(Source: stackoverflow.com)
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 …
When working with fairly big test suites in RSpec you do not want to run all tests always. Especially with Red-Green-Refactor you are only interested in some tests, sometimes even only in one describe block. RSpec helps you with this. You can specify specific files to be run:
spec spec/models/my_model_spec.rb spec spec/models/my_model_spec.rb spec/models/your_model_spec.rbSometimes spec-files get too big. Luckily RSpec allows to only execute blocks starting at a certain line in a file.
spec -l 548 spec/models/my_model_spec.rb
(Source: rspec.info)
The following two commands let you use the Mac OS X clipboard in terminal:
pbcopy pbpaste #examples cat text.txt | pbcopy pbpaste > copy_of_text.txt
(Source: blog.rogeriopvl.com)