Project

General

Profile

Miscellaneous » History » Version 24

Anonymous, 09/01/2024 04:38 PM
adding useful commands

1 1
h1. Miscellaneous
2
3 24
h2. List Root Device
4
5
<pre>
6
$ findmnt -n -o SOURCE /
7
</pre>
8
9
h2. List Block Devices with Serial Numbers
10
11
<pre>
12
$ lsblk --nodeps -o name,serial 
13
</pre>
14
15 23
h2. Useful rsync Examples
16
17
* Synchronize directories (one way):
18
<pre>
19
$ rsync -auhrP --delete --info=del,name,stats2 "/mnt/phalanx/" "/storage"
20
</pre>
21
* Copy with progress:
22
<pre>
23
$ rsync -ahr --info=progress2 some_file.mp4 /storage/
24
</pre>
25
26
27 22
h2. Patch Youtube App using Revanced Manager (6/22/2024)
28
29
h3. Install Steps
30
31
* Delete Revanced app, Micro G, Revanced manager prior installation any of mentioned apps.
32
* Download *but not install* following:
33
** Micro G - https://github.com/ReVanced/GmsCore/releases/tag/v0.3.1.3.240913
34
** Revanced Manager - https://revanced.app/patches?s=Mic
35
** YT App version 19.16.39 (must be this version; revanced manager will warn if not): https://www.apkmirror.com/apk/google-inc/youtube/youtube-19-16-39-release/youtube-19-16-39-android-apk-download/
36
* Install Micro G.
37
* Next install Revanced Manager
38
* Open Revanced manager
39
** Go to Patches
40
** Select an app
41
** Bottom right corner choose Storage
42
** Find YT APK you downloaded, select patch on the bottom right corner
43
* Wait for patch and compile to finish, then choose install app
44
* Open it, check if its Vanced, restart the phone.
45
* If you have stock YT app, uninstall updates and disable it
46
47
Source: https://www.reddit.com/r/revancedapp/comments/1bq92r7/me_rn_trying_to_patch_youtube_revanced/
48
49 19
h2. Combine find and GNU parallel
50
51
Example:
52
<pre>
53
$ find . -name '*.jpg' | parallel convert -geometry 120 {} {.}_thumb.jpg
54 21
$ find . -name '*.png' | parallel --eta convert '{}' -quality 90 '{.}.jpg'
55
$ find . -name '*.png' -delete
56 19
</pre>
57
Note @{.}@ is the filename without the @.jpg@ portion.
58
59
* See: https://www.gnu.org/software/parallel/parallel_examples.html#example-compute-intensive-jobs-and-substitution
60
61 18
h2. Setup ttyd
62
63
* Download @ttyd@ and put it in @/opt/local/bin/ttyd@:
64
** https://github.com/tsl0922/ttyd/releases
65
* Create systemd service file @/etc/systemd/system/ttyd.service@: 
66
<pre>
67
[Unit]                                                                                                                                                                                           
68
Description=TTYD
69
After=syslog.target
70
After=network.target
71
 
72
[Service]
73
ExecStart=/opt/local/bin/ttyd -W -p 9772 login
74
Type=simple
75
Restart=always
76
User=root
77
Group=root
78
 
79
[Install]
80
WantedBy=multi-user.target
81
</pre>
82
** Start and enable service:
83
<pre>
84
$ sudo systemctl start ttyd && sudo systemctl enable ttyd
85
</pre>
86
* Setup apache configuration (add to existing)
87
<pre>
88
        ProxyRequests Off
89
        ProxyPreserveHost On
90
        RewriteEngine on
91
        RewriteCond %{HTTP:Upgrade} websocket [NC]
92
        RewriteCond %{HTTP:Connection} upgrade [NC]
93
        RewriteRule /terminal/?(.*) "ws://localhost:9772/$1" [P,L]
94
        ProxyPass /terminal http://localhost:9772/
95
        ProxyPassReverse /terminal http://localhost:9772/
96
</pre>
97
** Enable necessary apache modules:
98
<pre>
99
$ a2enmod proxy proxy_http proxy_wstunnel mod_rewrite
100
</pre>
101
102
103 17
h2. Increase tmux scrollback
104
105
<pre>
106
$ cd 
107
$ echo "set -g history-limit 9999999" >> ~/.tmux.conf
108
</pre>
109
110 16
h2. Setup VNC
111 15
112
On the server side:
113
# Install @x11vnc@:
114
<pre>
115
$ sudo apt install x11vnc net-tools
116
</pre>
117
# Set VNC password:
118
<pre>
119
$ x11vnc -storepasswd
120
</pre>
121
# Start VNC service from command line:
122
<pre>
123
$ sudo x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /home/dsorber/.vnc/passwd -rfbport 5900 -shared
124
</pre>
125
# To start at boot using systemd service create: @/etc/systemd/system/x11vnc.service@:
126
<pre>
127
[Unit]
128
Description=x11vnc remote desktop server
129
After=multi-user.target
130
131
[Service]
132
Type=simple
133
ExecStart=/usr/bin/x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /home/dsorber/.vnc/passwd -rfbport 5900 -shared
134
135
Restart=on-failure
136
137
[Install]
138
WantedBy=multi-user.target
139
</pre>
140
141
On the client side:
142
# Install @remmina@:
143
<pre>
144
$ sudo apt install remmina
145
</pre>
146
# Open @remmina@, select "VNC", and type in the server's IP address.
147
148
* Source: https://forums.linuxmint.com/viewtopic.php?t=369092
149
150 14
h2. sshuttle
151 15
152
Poor man's VPN:
153 14
154
<pre>
155
$ sshuttle --dns -NHr dsorber@phalanx.homelinuxserver.org:3268  192.168.0.0/16
156
</pre>
157
158 13
h2. Batch Convert PNG to JPG
159
160
NOTE: @convert@ comes from ImageMagick
161
<pre>
162
& ls -1 *.png | parallel --eta convert '{}' -quality 90 '{.}.jpg'
163
</pre>
164
165 12
h2. Crop Video with ffmpeg
166
167
<pre>
168
$ ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4
169
</pre>
170
171
* @out_w@ is the width of the output rectangle
172
* @out_h@ is the height of the output rectangle
173
* @x@ and @y@ specify the top left corner of the output rectangle (coordinates start at (0,0) in the top left corner of the input) 
174
175
Test using @ffplay@:
176
<pre>
177
$ ffplay -i input -vf "crop=out_w:out_h:x:y"
178
</pre>
179
180 10
h2. Build Custom Windows ISOs
181
182
* https://uupdump.net/
183 11
* https://forums.mydigitallife.net/threads/kms_vl_all-smart-activation-script.79535/
184 10
185 9
h2. Script to Convert Local manpages to html
186
187
Note use @zcat@ if the manpages are compressed:
188
189
<pre>
190
#!/bin/bash
191
192
mkdir -p html
193
for file in *; do
194
        if [ -f $file ] && [ "${file: -3}" != ".sh" ]; then
195
                echo $file
196
                #echo "${file%.*}"
197
                pandoc --from man --to html < $file > html/${file%.*}.html
198
        fi
199
done
200
</pre>
201
202 6
h2. Display Total rsync Progress
203
204
<pre>
205 7
$ rsync -a --no-i-r --info=progress2 /path/to/src /path/to/dest/
206 6
</pre>
207
208
NOTE: @-v@ does not work with @--info=progress2@
209
210
Source: https://serverfault.com/a/441724/472586
211
212 5
h2. Slice Video File 
213
214
<pre>
215
$ ffmpeg -ss 00:01:00 -to 00:02:00  -i input.mp4 -c copy output.mp4
216
</pre>
217
218
Explanation of the command:
219
220
* -i: This specifies the input file. In that case, it is (input.mp4).
221
* -ss: Used with -i, this seeks in the input file (input.mp4) to position.
222
* 00:01:00: This is the time your trimmed video will start with.
223
* -to: This specifies duration from start (00:01:40) to end (00:02:12).
224
* 00:02:00: This is the time your trimmed video will end with.
225
* -c copy: This is an option to trim via stream copy. (NB: Very fast)
226
227 4
h2. Add new drive SW RAID5
228
229
# Format drive if needed (see below for steps).
230
# Add new drive to SW RAID:
231
<pre>
232
$ sudo mdadm --manage /dev/md0 --add /dev/sdd1
233
</pre>
234
# Grow array:
235
<pre>
236
$ sudo mdadm --grow --raid-devices=4 /dev/md0
237
</pre>
238
239
h2. Replace failed SW RAID drive
240
241
# If drive is brand new be sure to create a partition on it:
242
<pre>
243
sorber@file2:~$ sudo parted /dev/sdg
244
GNU Parted 3.3
245
Using /dev/sdg
246
Welcome to GNU Parted! Type 'help' to view a list of commands.
247
(parted) mklabel gpt
248
(parted) mkpart primary 2048s 100%                                        
249
(parted) print                                                            
250
Model: ATA ST2000DM008-2FR1 (scsi)
251
Disk /dev/sdg: 2000GB
252
Sector size (logical/physical): 512B/4096B
253
Partition Table: gpt
254
Disk Flags: 
255
256
Number  Start   End     Size    File system  Name     Flags
257
 1      1049kB  2000GB  2000GB               primary
258
259
(parted) quit
260
</pre>
261
# If needed, mark bad drive as failed:
262
<pre>
263
$ sudo mdadm --manage /dev/md0 --fail /dev/sdd
264
</pre>
265
# Add new drive to replace failed:
266
<pre>
267
$ sudo mdadm --manage /dev/md0 --add /dev/sdd1 /dev/sdg1
268
</pre>
269
# Improve rebuild speed slightly:
270
<pre>
271
$ sudo bash -c "echo 9999999 > /proc/sys/dev/raid/speed_limit_min"
272
$ sudo bash -c "echo 9999999 > /proc/sys/dev/raid/speed_limit_max"
273
</pre>
274
# Monitor rebuild:
275
<pre>
276
$ watch -n1 cat /proc/mdstat 
277
</pre>
278
279
h2. Get detailed drive information
280
281
<pre>
282
$ udevadm info --query=all --name=/dev/sda
283
</pre>
284
285 1
h2. Split flac with cue
286
287
<pre>
288
$ sudo apt install cuetools shntool
289
290
$ shnsplit -f file.cue -t %n-%t -o flac file.flac
291
</pre>
292
293
h2. Fix Chrome Display Glitches
294
295
Somewhere around Chrome 86 display glitches started happening on wake. Here is how to fix:
296
297 3
Enabling @enable-vulkan@ in @chrome://flags@ then restarting the browser fixed it. If that does not work, you can also try enabling `ignore-gpu-blacklist` as well.
298 1
299
h2. Setup SSH Public Key
300
301
# On host machine generate a key pair. This key can be reused for multiple remote machines so it's not really necessary to change the name unless multiple keys are generated, which is also not really needed.
302
<pre>
303
$ ssh-keygen -t rsa
304
</pre>
305 3
 *NOTE:* for NetBeans to use/recognize the ssh key you must use the old PEM format:
306 1
<pre>
307
$ ssh-keygen -m PEM -t rsa
308
</pre>
309
# Now use `ssh-copy-id` to copy the key to the remote machine (for example):
310
<pre>
311
$ ssh-copy-id -i ~/.ssh/phalanx_rsa.pub dsorber@phalanx
312
</pre>
313
314
h2. Read Windows Product Key from ACPI Firmware
315
316
Boot into Linux and run:
317
318
<pre>
319
$ sudo strings /sys/firmware/acpi/tables/MSDM
320
</pre>
321
322
h2. Windows 10 Install and SysPrep Instructions
323
324
Very good instructions: https://theitbros.com/sysprep-windows-10-machine-guide/
325
326
327
h2. Search and Replace on Binary Files
328
329
A good hex editor can do search and replace on binary files but sometimes that's not practical:
330
331
* BBE - https://sourceforge.net/projects/bbe-/
332
 BBE is a binary editor with SED-like syntax:
333
<pre>
334
$ bbe -e 's/\x0a\x0d\x0a/\x0d\x0a/' infile > outfile
335
</pre>
336
* binwalk - https://github.com/ReFirmLabs/binwalk
337
 binwalk can search for hex strings (and do many other things)
338
<pre>
339
$ binwalk -R "\x0a\x0d\x0a" infile
340
341
WARNING: Signature '0    string    \x0a\x0d\x0a    Raw signature (\x0a\x0d\x0a)' is a self-overlapping signature!
342
343
DECIMAL       HEXADECIMAL     DESCRIPTION
344
--------------------------------------------------------------------------------
345
242           0xF2            Raw signature (\x0a\x0d\x0a)
346
412           0x19C           Raw signature (\x0a\x0d\x0a)
347
580           0x244           Raw signature (\x0a\x0d\x0a)
348
749           0x2ED           Raw signature (\x0a\x0d\x0a)
349
. . .
350
</pre>
351
352
h2. Wake-on-LAN WOL
353
354
Must be enabled on interface; need MAC
355
<pre>
356
$ sudo apt install etherwake
357
$ sudo etherwake <target MAC> -i <outgoing interface>
358
359
$ sudo etherwake b4:2e:99:a5:1e:f0 -i enp30s0
360
</pre>
361
362
h2. Allocator Shim
363
364
From Chromium, this is really interesting
365
* https://chromium.googlesource.com/chromium/src/base/+/master/allocator/README.md
366
367
However it is not clear how to use it outside of Chromium.
368
369
h2. Update Geany
370
371
# Install prereq packages (this obviously only needs to be done once):
372
<pre>
373
$ sudo apt install libgtk-3-dev libgtkspell-dev libgtkspell3-3-dev
374
</pre>
375
# Set compile flags:
376
<pre>
377
$ export CFLAGS="-O3 -march=native" 
378
$ export CXXFLAGS=$CFLAGS
379
</pre>
380
# Build geany and set to install in /opt so it won't collide with the packaged version:
381
<pre>
382
$ tar xf geany-1.30.tar.bz2
383
$ cd geany-1.30/
384
$ ./configure --prefix=/opt/local --enable-gtk3
385
$ make -j20
386
$ sudo make install
387
</pre>
388
# Set PKG_CONFIG_PATH environment variable so we can build the plugins.
389
<pre>
390
$ export PKG_CONFIG_PATH=/opt/local/lib/pkgconfig/
391
</pre>
392
# Build geany-plugins:
393
<pre>
394
$ tar xf geany-plugins-1.30.tar.bz2 
395
$ cd geany-plugins-1.30/
396
$ ./configure --prefix=/opt/local --enable-gtk3
397
$ make -j20
398
$ sudo make install
399
</pre>
400
401
h2. Find and replace across multiple files
402
403
<pre>
404
$ find /home/www -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'
405
</pre>
406
407
h2. Useful IPMI commands
408
409
410
Power measurement on the SuperMicro (probably won't work on Dell chassis as they have some proprietary version of ipmi):
411
412
<pre>
413
sudo ipmitool -U ADMIN -P ADMIN -H 10.17.136.108 dcmi power reading
414
</pre>
415
416
Check power status (i.e. on/off) of chassis:
417
<pre>
418
sudo ipmitool -U ADMIN -P ADMIN -H 10.17.70.45 power status
419
sudo ipmitool -U ADMIN -P ADMIN -H 10.17.70.45 power off
420
</pre>
421
422
Get IPMI IP address (look for "IP Address"):
423
<pre>
424
sudo ipmitool lan print 
425
</pre>
426
427
h2. Full sshfs Connect Command
428
429
<pre>
430
sudo sshfs -o idmap=user -o uid=$(id -u) -o gid=$(id -g) -o allow_other -o follow_symlinks ryftuser@sm-X11DGQ:/home/ryftuser /mnt/sm-X11DGQ/
431
</pre>
432
433
h2. Side-by-side Color Diff
434
435
<pre>
436
$ sudo apt-get install colordiff
437
$ colordiff -y --suppress-common-lines data.txt /ryftone/data.txt
438
</pre>
439
440
h2. x86 ABI
441
442
* https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI
443
444
h2. clang-format and clang-tidy
445
446
* http://www.labri.fr/perso/fleury/posts/programming/using-clang-tidy-and-clang-format.html
447
448
h2. Shared Library and Related Resources
449
450
* http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
451
* https://blog.qt.io/blog/2011/10/28/rpath-and-runpath/
452
* http://www.bnikolic.co.uk/blog/linux-ld-debug.html
453
* http://insanecoding.blogspot.com/2012/07/creating-portable-linux-binaries.html
454
* https://stackoverflow.com/questions/4156055/static-linking-only-some-libraries
455
456
h2. Ubuntu: List Grub Entries
457
458
<pre>
459
gawk  'BEGIN {                                                                                                                       
460
  l=0                                                                                                                                
461
  menuindex= 0                                                                                                                       
462
  stack[t=0] = 0                                                                                                                     
463
}                                                                                                                                    
464
465
function push(x) { stack[t++] = x }                                                                                                  
466
467
function pop() { if (t > 0) { return stack[--t] } else { return "" }  }                                                              
468
469
{                                                                                                                                    
470
471
if( $0 ~ /.*menu.*{.*/ )                                                                                                             
472
{                                                                                                                                    
473
  push( $0 )                                                                                                                         
474
  l++;                                                                                                                               
475
476
} else if( $0 ~ /.*{.*/ )                                                                                                            
477
{                                                                                                                                    
478
  push( $0 )                                                                                                                         
479
480
} else if( $0 ~ /.*}.*/ )                                                                                                            
481
{                                                                                                                                    
482
  X = pop()                                                                                                                          
483
  if( X ~ /.*menu.*{.*/ )                                                                                                            
484
  {                                                                                                                                  
485
     l--;                                                                                                                            
486
     match( X, /^[^'\'']*'\''([^'\'']*)'\''.*$/, arr )                                                                               
487
488
     if( l == 0 )                                                                                                                    
489
     {                                                                                                                               
490
       print menuindex ": " arr[1]                                                                                                   
491
       menuindex++                                                                                                                   
492
       submenu=0                                                                                                                     
493
     } else                                                                                                                          
494
     {                                                                                                                               
495
       print "  " (menuindex-1) ">" submenu " " arr[1]                                                                               
496
       submenu++                                                                                                                     
497
     }                                                                                                                               
498
  }                                                                                                                                  
499
}                                                                                                                                    
500
501
}' /boot/grub/grub.cfg
502
</pre>
503
504
* https://askubuntu.com/a/941993/392271
505
506
507
h2.GCC Disable Unused Variable Warnings
508
509
<pre>
510
#pragma GCC diagnostic push
511
#pragma GCC diagnostic ignored "-Wunused-variable"
512
( your problematic library includes )
513
#pragma GCC diagnostic pop
514
</pre>
515
516
See: https://stackoverflow.com/a/22708539/73878
517
518
h2. Fix Steam after NVidia driver update
519
520
Since this has now bitten me twice... Steam requires the 32 bit version of the GL library.
521
522
<pre>
523
$ sudo apt install libnvidia-gl-418:i386
524
</pre>
525
526
h2. Restart Cinnamon from TTY
527
528
# Cinnamon freezes
529
# Switch tty. I usually go to tty6, `Ctrl+Alt+F6`
530
# If you need to login first, do so.
531
# Type `w` (yes, just the letter) and press enter. This commands does a lot of different things, but you need it to figure out the number of the display you are using. The display number is in the column FROM. Mine is `:0` (yes, including the colon).
532
# Assuming that cinnamon is already dead (which you would notice by the windows lacking titles and that you can't move different windows around, and perhaps even not being able to use the keyboard), you type `export DISPLAY=:0; cinnamon &`, and don't forget the colon. I add the ampersand (&) only not to keep that tty busy.
533
534
Sauce: https://askubuntu.com/a/198935/392271
535
536
h2. Ubuntu Set Specific Kernel to Boot
537
538
* Use this command to get a list of available options:
539
<pre>
540
$ grep -Ei 'submenu|menuentry ' /boot/grub/grub.cfg | sed -re "s/(.? )'([^']+)'.*/\1 \2/"
541
menuentry  Ubuntu
542
submenu  Advanced options for Ubuntu
543
    menuentry  Ubuntu, with Linux 4.4.0-34-generic
544
    menuentry  Ubuntu, with Linux 4.4.0-34-generic (upstart)
545
    menuentry  Ubuntu, with Linux 4.4.0-34-generic (recovery mode)
546
menuentry  System setup
547
</pre>
548
* Backup grub configuration, just in case:
549
<pre>
550
$ sudo cp /etc/default/grub /etc/default/grub.bak
551
</pre>
552
* Edit grub configuration and change `GRUB_DEFAULT` to something like this:
553
<pre>
554
$ sudo vim /etc/default/grub
555
556
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 3.13.0-53-generic"
557
</pre>
558
* Update grub configuration
559
<pre>
560
$ sudo update-grub
561
</pre>
562
* See also: https://askubuntu.com/questions/216398/set-older-kernel-as-default-grub-entry
563
564
h2. Ubuntu Networking Resources
565
566
* https://blog.ubuntu.com/2017/12/01/ubuntu-bionic-netplan
567
* https://help.ubuntu.com/lts/serverguide/network-configuration.html.en
568
* https://netplan.io/
569
570
h2. Win10 Licensing Info
571
572
* https://www.windowscentral.com/how-change-product-key-windows-10
573
* https://www.tenforums.com/tutorials/49586-determine-if-windows-license-type-oem-retail-volume.html
574
* https://www.tenforums.com/windows-updates-activation/104569-win-10-activation-expiring-volume-license.html
575
576
h2. Python GTK Development Resources
577
578
* https://python-gtk-3-tutorial.readthedocs.io/en/latest/layout.html
579
* https://lazka.github.io/pgi-docs/Gtk-3.0/classes/Box.html#Gtk.Box.pack_start
580
* https://lazka.github.io/pgi-docs/Gtk-3.0/mapping.html
581
582
h2. cpufrequtils Governor Configuration
583
584
These instructions are intended for Ubuntu 16.04 and later (using systemd init).
585
586
* Check the available and currently set governors. Ubuntu has an โ€œondemandโ€ service that sets the governor to ondemand after boot.
587
<pre>
588
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
589
conservative ondemand userspace powersave performance schedutil
590
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 
591
ondemand
592
</pre>
593
594
* Configure cpufrequtils to set the governor to performance at boot
595
<pre>
596
$ echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
597
GOVERNOR="performance"
598
</pre>
599
600
* Disable the automatic ondemand service. 
601
<pre>
602
$ sudo systemctl disable ondemand
603
</pre>
604
605
* Reboot.
606
607
* Now check that the governor is set to performance for every CPU:
608
<pre>
609
$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
610
performance
611
performance
612
performance
613
performance
614
โ€ฆ
615
performance
616
performance
617
performance
618
</pre>
619
620
* Check current CPU speeds:
621
<pre>
622
$ watch -n 1 bash -c 'cpufreq-info | grep "current CPU frequency"'
623
</pre>
624
625
h2. rsync via ssh example
626
627
<pre>
628
$ rsync --info=progress2 -ahz --compress-level=9 -e "ssh -i ~/ryft-pat-f1.pem" data/ ryftuser@18.205.65.5:/ryftone/regression/pubmed/data/
629
</pre>
630
631
h2. Read Performance using AIO
632
633
Use this fio command (run from temp directory on disk in question) to measure max disk read performance:
634
635
<pre>
636
$ fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=read --size=10g --io_size=10g --blocksize=512k --ioengine=libaio --fsync=0 --iodepth=32 --direct=1 --numjobs=1 --runtime=300 --group_reporting
637
</pre>
638
639
Note that DIRECT_IO is required when using AIO. (see also: https://askubuntu.com/a/991311/392271)
640
641
h2. Remove Source Files While Creating Tarball
642
643
This is handy as it saves on disk space.
644
<pre>
645
$ tar --remove-files -cf pictures.tar Pictures/
646
</pre>
647
648
h2. Linux Find and Remove Files
649
650
Find and remove files (even with spaces in the path) using case insensitive matching for the wildcard:
651
<pre>
652
$ find . -type f -iname "*.jpg" -print0 | xargs -0 rm
653
</pre>
654
655
h2. Convert ASCII hex to binary
656
This problem seems to come up every so often. There is no need for a one-off solution:
657
658
<pre>
659
$ xxd -r -p input.txt output.bin
660
</pre>
661
662
https://stackoverflow.com/questions/7826526/transform-a-hex-info-to-binary-using-linux-command
663
664
h2. Well Said
665
666
https://developers.slashdot.org/comments.pl?sid=12326098&cid=56908942
667
668
h2. Hex Editor
669
670
I had been using [[https://hexinator.com/|Hexinator]] but I've had some minor issues with it. Today I tried [[https://www.wxhexeditor.org/home.php|wxHexEditor]] and I was pleasantly surprised.
671
672
Download from here: https://github.com/EUA/wxHexEditor
673
674
You'll need the latest version of libwxgtk<version>-dev package.
675
676
I had some minor issues with the build (which seems a somewhat bizarre arrangement...) modify the makefile to set `CC` and `CXX` directly, right about line 90.
677
678
Finally, to get it installed in the right place:
679
<pre>
680
sudo make install DESTDIR=/opt/local BINDIR=bin DATADIR=share
681
</pre>
682
683
h2. Preprocessor Fun
684
685
To invoke the preprocessor directly:
686
<pre>
687
gcc -E -DSOME_DEFINE=SOME_VALUE somefile.c 
688
</pre>
689
690
See also [[https://linux.die.net/man/1/unifdef|unifdef]]: "The unifdef utility acts on #if, #ifdef, #ifndef, #elif, #else, and #endif lines, and it understands only the commonly-used subset of the expression syntax for #if and #elif lines."
691
692
h2. Convert Oversampled .flac to 16 bit 44.1 khz .flac
693
694
<pre>
695
mkdir -p output && find . -type f -name "*.flac" | parallel -j16 "sox {} -b 16 -r 44100 output/{/.}.flac"
696
697
mkdir -p output && find . -type f -name "*.flac" | parallel -j16 "sox -v 0.98 {} -b 16 -r 44100 output/{/.}.flac"
698
</pre>
699
700
h2. Aligned C++ STL Types
701
702
<pre>
703
#include <vector>
704
#include <boost/align/aligned_allocator.hpp>
705
706
template <typename T>
707
using aligned_vector = std::vector<T, boost::alignment::aligned_allocator<T, 4096>>;
708
</pre>
709
710
h2. Command line convert .png to .jpg
711
712
<pre>
713
$ for x in *.png; do convert $x $(basename $x .png).jpg; done
714
</pre>
715
716
You can also add the "`-quality 90`" option if needed.
717
718
h2. Determine CPU Family Name
719
720
<pre>
721
$ gcc -march=native -Q --help=target|grep march
722
</pre>
723
724
h2. Convert .flac to .m4a (AAC)
725
726
Requires `ffmpeg` built with libfdk_aac:
727
728
<pre>
729
$ /opt/bin/ffmpeg -i input.flac -vn -c:a libfdk_aac -vbr 3 output.m4a
730
</pre>
731
732
All together using `find` and `parallel` for magic:
733
<pre>
734
$ find . -type f -name "*.flac" | parallel -j16 "/opt/bin/ffmpeg -i {} -vn -c:a libfdk_aac -vbr 4 {/.}.m4a"
735
</pre>
736
737
h2. PyGObject
738
739
This is the magic needed to have stuff happen quasi asynchronously using PyGObject (GTK+):
740
741
<pre>
742
# Yield to the main loop temporarily
743
while Gtk.events_pending():
744
    Gtk.main_iteration()
745
</pre>
746
747
h2. FUSE Code
748
749
 *https://pastebin.com/wavKntiu
750
751
h2. Use Windoze Schtuffs
752
753
 * https://support.microsoft.com/en-gb/help/17588/fix-problems-that-block-programs-from-being-installed-or-removed (gotta love how this requires a separate program)
754
 * [[http://landinghub.visualstudio.com/visual-cpp-build-tools|MSVC Tools]] - compiler (seems to be the rough equivalent of `build-essential`)
755
 * [[https://docs.microsoft.com/en-us/sysinternals/downloads/procmon|Process Monitor]] - useful debug tool
756
  * https://www.codeproject.com/Articles/560816/Troubleshooting-dependency-resolution-problems-usi - example for using Process Monitor
757
 * http://download.microsoft.com/download/7/2/E/72E0F986-D247-4289-B9DC-C4FB07374894/wdexpress_full.exe - (required by wingtk below)
758
 
759
* https://github.com/wingtk/gvsbuild - haven't tried this yet but looks amazing... 
760
761
h2. Build Handbrake Git Build
762
763
Steps for building Handbrake using AOCC:
764
765
<pre>
766
$ source /home/dsorber/Downloads/aocc/setenv_AOCC.sh
767
$ export CC=clang
768
$ export CXX=clang++
769
$ export CFLAGS="-g -O3 -mtune=native"
770
$ export CXXFLAGS=$CFLAGS
771
$ cd ~/Downloads/HandBrake/
772
$ rm -rf build/
773
$ ./configure --prefix=/opt --enable-x265 --enable-fdk-aac --gcc=/home/dsorber/Downloads/aocc/AOCC-1.1-Compiler/bin/clang
774
$ cd build
775
$ make -j17
776
$ sudo make install
777
</pre>
778
779
----
780
781
Regular build (18.04 and later):
782
<pre>
783
$ rm -rf build/
784
$ ./configure --prefix=/opt/local --enable-x265 --enable-fdk-aac
785
$ cd build
786
$ make -j17
787
$ sudo make install
788
</pre>
789
790
h2. Politically Correct Linux
791
792
* https://entertainment.slashdot.org/comments.pl?sid=11493671&cid=55759997
793
794
h2. This guy gets it
795
796
Regarding software purist ideology vs pragmatism
797
798
* https://linux.slashdot.org/comments.pl?sid=11156367&cid=55256437
799
800
h2. "Rotate" Video Playback via Metadata
801
802
<pre>
803
$ ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=90 output.mp4
804
</pre>
805
806
807
h2. Ubuntu Remove Old Kernels Oneliner
808
809
<pre>
810
$ sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)
811
</pre>
812
813
* [[https://askubuntu.com/questions/2793/how-do-i-remove-old-kernel-versions-to-clean-up-the-boot-menu/571360#571360|Sauce]]
814
815
h2. Remove New Lines (command line)
816
817
For a file:
818
<pre>
819
$ tr -d '\n' < yourfile.txt
820
</pre>
821
822
Or for output of a command (e.g.):
823
<pre>
824
$ find . -type f -name '*.txt' | tr -d '\n'
825
</pre>
826
827
h2. Convert from .mp4 to .mkv Container
828
829
Use `avconv` to convert container without re-encoding:
830
<pre>
831
$ sudo apt-get install libav-tools
832
833
$ avconv -i filme.mp4 -c copy filme.mkv
834
</pre>
835
836
h2. Remove String From Many File Names
837
838
On Ubuntu use Perl rename utility, e.g.:
839
840
<pre>
841
$ rename 's/ \(1920x1080\) \[WaifuKenny\]//' *.mp4
842
</pre>
843
844
h2. Change Default Text Editor
845
846
I always have to Google this...
847
848
<pre>
849
$ sudo update-alternatives --config editor
850
</pre>
851
852
h2. Linux View System RAM Speed
853
854
View RAM speed (actual) on Debian/Ubuntu/Mint:
855
856
<pre>
857
$ sudo lshw -short -C memory
858
H/W path                      Device      Class          Description
859
====================================================================
860
/0/0                                      memory         64KiB BIOS
861
/0/b                                      memory         32GiB System Memory
862
/0/b/0                                    memory         [empty]
863
/0/b/1                                    memory         16GiB DIMM Synchronous 2134 MHz (0.5 ns)
864
/0/b/2                                    memory         [empty]
865
/0/b/3                                    memory         16GiB DIMM Synchronous 2134 MHz (0.5 ns)
866
/0/d                                      memory         768KiB L1 cache
867
/0/e                                      memory         4MiB L2 cache
868
/0/f                                      memory         16MiB L3 cache
869
</pre>
870
871
h2. Linux Memory Schtuff
872
873
* [[https://github.com/jbert/exmap|exmap]]
874
* https://jameshunt.us/writings/smaps.html
875
* https://techtalk.intersec.com/2013/07/memory-part-2-understanding-process-memory/
876
* http://bmaurer.blogspot.com/2006/03/memory-usage-with-smaps.html
877
878
* https://github.com/torvalds/linux/blob/master/Documentation/filesystems/proc.txt
879
880
* From: http://stackoverflow.com/questions/24484481/entry-in-proc-meminfo
881
<pre>
882
  2. Active(file), Inactive(file) has file back-end which means its original file is in disk but to use it faster it was loaded on RAM.
883
</pre>
884
885
886
* From: http://unix.stackexchange.com/questions/56879/tracking-down-missing-memory-usage-in-linux
887
888
  The "memory used by a process" is not a clear cut concept in modern operating systems. What can be measured is the size of the address space of the process (SIZE) and resident set size (RSS, how many of the pages in the address space are currently in memory). Part of RSS is shared (most processes in memory share one copy of glibc, and so for assorted other shared libraries; several processes running the same executable share it, processes forked share read-only data and possibly a chunk of not-yet-modified read-write data with the parent). On the other hand, memory used for the process by the kernel isn't accounted for, like page tables, kernel buffers, and kernel stack. In the overall picture you have to account for the memory reserved for the graphics card, the kernel's use, and assorted "holes" reserved for DOS and other prehistoric systems (that isn't much, anyway).
889
890
  The only way of getting an overall picture is what the kernel reports as such. Adding up numbers with unknown overlaps and unknown left outs is a nice exercise in arithmetic, nothing more.
891
892
 * [[http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html|Understanding memory usage on Linux]]
893
894
 * https://linux-mm.org/LinuxMM
895
896
h2. Reinstall grub on UEFI System
897
898
Reinstalling grub on a UEFI system is slightly different than on a traditional legacy BIOS system:
899
900
<pre>
901
# Mount the primary drive root partition and the boot EFI partition
902
sudo mount /dev/sda# /mnt            # Mount root (/) partition
903
sudo mount /dev/sda# /mnt/boot       # Mount boot (/boot) partition (if separate from root partition; typically not)
904
905
sudo mkdir -p /mnt/boot/efi          # Create EFI partition mount point
906
sudo mount /dev/sda1 /mnt/boot/efi   # Mount EFI partition
907
908
# Mount your virtual filesystems:
909
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
910
911
# Chroot
912
sudo chroot /mnt
913
</pre>
914
915
Now, if you have networking you'll need DNS. If using `resolvconf` (for recent versions of Ubuntu):
916
917
# Edit ` /etc/resolvconf/resolv.conf.d/head` and add the following line (OpenDNS server).  Then save and exit:
918
<pre>
919
add nameserver 208.67.222.222
920
</pre>
921
# Next enable updates and update:
922
<pre>
923
sudo resolvconf --enable-updates
924
sudo resolvconf -u
925
</pre>
926
# Now you should have DNS. Test by pinging something.
927
928
Finally, back to fixing grub. Note that the grub install should run smoothly with no errors or warnings. If you see any something is probably wrong.
929
<pre>
930
apt-get install grub-efi-amd64  # Install grub EFI bootloader (this should be all you need to do)
931
932
933
# manual steps if you need them for some reason
934
grub-install --recheck --no-floppy --force /dev/sda1  # Install grub bootloader in EFI partition
935
936
#####
937
echo "configfile (hd0,gpt#)/boot/grub.cfg" > /boot/efi/ubuntu/grub.cfg # Tell grub to load grub.cfg from /boot
938
939
update-grub                          # Create grub menu list
940
#####
941
942
exit                                 # Exit chroot
943
</pre>
944
945
Reboot and you should be back in business.
946
947
h2. Convert flac to VBR mp3 using ffmpeg/lame
948
949
<pre>
950
for file in *.flac; do name=$(echo $file | sed "s/\.flac//g"); ffmpeg -i "$file" -codec:a libmp3lame -qscale:a 0 "$name".mp3; done
951
</pre>
952
953
h2. Create UEFI/legacy BIOS Bootable ISO
954
955
* http://askubuntu.com/questions/625286/how-to-create-uefi-bootable-iso
956
957
h2. Getting rEFInd to work on Mac OS 10.11
958
959
* http://mattjanik.ca/blog/2015/10/01/refind-on-el-capitan/
960
961
h2. Convert DTS 5.1 to FLAC
962
963
<pre>
964
sudo apt-get install libdca-utils ffmpeg sound-juicer gnome-terminal easytag vlc 
965
966
for file in *.wav; do name=$(echo $file | sed "s/\.wav//g"); dcadec -o wavall "$file" > "$name"_decoded.wav; ffmpeg -i "$name"_decoded.wav "$name".flac; rm -f "$file" "$name"_decoded.wav; done
967
</pre>
968
969
Source: http://ubuntuforums.org/archive/index.php/t-1849260.html
970
971
h2. Windows Utils
972
973
* http://windirstat.info/download.html
974
* https://www.raymond.cc/blog/safely-delete-unused-msi-and-mst-files-from-windows-installer-folder/
975
976
h2. SSH Security
977
978
https://stribika.github.io/2015/01/04/secure-secure-shell.html
979
980
h2. Windows 10
981
982
* http://ultimateoutsider.com/downloads/ - GWX Control Panel to disable GWX (Windows 10 update nagging)
983
* [[https://www.safer-networking.org/spybot-anti-beacon/|Spybot Anti-Beacon]] - Disable Micro$oft "telemetry" data gathering from Windows 10, 8.x, and 7
984
985
<pre>
986
The newest version of the KB3035583 update includes a background process which scans the 
987
system's Windows Registry twice a day to see if the values for the four aforementioned registry 
988
inputs were manually edited to disable the upgrade prompt. If they were, the process will alter 
989
the values, silently re-download the Windows 10 installation files (about 6 GB in total), and 
990
prompt the user to upgrade.
991
</pre>
992
993
994
h2. gpg-agent
995
996
* http://www.infrastructureanywhere.com/documentation/additional/mirrors.html
997
998
These instructions are geared toward reprepro but should be useful in general for setting up `gpg-agent`.
999
1000
1001
h2. Resolve DNS While VPN Connected
1002
1003
How to configure dnsmasq for DNS overrides while using a VPN connection: https://chawlasumit.wordpress.com/2014/06/15/linux-mint-openconnect-vpn-dns-issues/
1004
1005
h2. Pretty Print Python Traceback
1006
1007
<pre>#!python
1008
import traceback
1009
1010
 ...
1011
1012
try: 
1013
    with open('/dev/null', 'w') as void:
1014
        rc = not bool(subprocess.call('modprobe -r {:s}'.format(mod_name), 
1015
                                      shell=True, stdout=void, stderr=void))
1016
except Exception as e:
1017
    print_failure_status()
1018
    exc_type, exc_value, exc_traceback = sys.exc_info()
1019
    print('\n')
1020
    traceback.print_exception(exc_type, exc_value, exc_traceback)
1021
    print('\n')
1022
</pre>
1023
1024
h2. Generating Random Data Files for Testing
1025
1026
One approach is to use /dev/urandom (non-blocking pseudorandom device):
1027
<pre>
1028
$ dd if=/dev/urandom bs=32M count=32 of=data_1GB.bin
1029
</pre>
1030
Unfortunately /dev/urandom is a bit slow. However, you can alternatively use openssl to generate pseudorandom numbers a bit faster:
1031
<pre>
1032
 $ openssl rand 1073741824 > data_1GB.bin
1033
 $ for run in {1..30}; do echo $run; openssl rand 1073741824 >> data_30GB.bin; done
1034
</pre>
1035
1036
h2. Cloning HDDs
1037 8
1038 1
When configuring multiple chassis it is necessary to clone an HDD. There are all sorts of disk imaging tools out there but it's hard to beat the trusty dd command. The pv (pipe viewer) portion isn't strictly necessary but it prints out a very useful textual status bar. The back ticked blockdev command reports the size of the drive in bytes, which pv then uses to determine overall progress. The bs argument to dd should correspond to the cache size of the drive for optimum performance (32MB is a sane default for most drives these days).
1039
1040
To clone a single drive to another identical drive (assuming sda is the source and sdb is the destination):
1041
<pre>
1042
 $ sudo dd if=/dev/sda bs=32M | pv -s `sudo blockdev --getsize64 /dev/sda` | sudo dd of=/dev/sdb bs=32M
1043
</pre>
1044
To clone to multiple drives all at once (assuming sda is the source and sdb, sdc are destinations):
1045
<pre>
1046
 $ sudo dd if=/dev/sda bs=32M | pv -s `sudo blockdev --getsize64 /dev/sda` | tee >(sudo dd of=/dev/sdb bs=32M) | sudo dd of=/dev/sdc bs=32M
1047
</pre>
1048
It is entirely possible to clone more drives by adding additional `>(sudo dd of=/dev/sdX bs=32M)` arguments to the tee command. Note that tee outputs to stdout so it is necessary to pipe the output of tee to the final dd command as shown above. If you don't do this then tee will spew the raw contents of the source HDD to your screen, which will make the clone take forever and look especially ugly!
1049
1050
For some reason RedHat/CentOS do not have the pv command or even a package for it in their repos!!! Therefore, boot from a Debian-based OS in order to clone.
1051
1052
h2. Generating ISOs
1053
1054
<pre>
1055
 $ genisoimage -R -J -o <output.iso> <some directory>
1056
</pre>
1057
To deal with long file names:
1058
<pre>
1059
 $ genisoimage -R -J -l -D -joliet-long -o <output.iso> <some directory>
1060
</pre>
1061
1062 2
h2. BIOS/grub
1063 1
1064 2
* http://forums.linuxmint.com/viewtopic.php?f=46&t=119832
1065
* http://www.gnu.org/software/grub/manual/html_node/BIOS-installation.html
1066
* https://wiki.archlinux.org/index.php/GRUB2
1067
* http://unix.stackexchange.com/questions/28443/does-grub2-support-putting-boot-on-a-raid5-partition
1068 1
1069
h3. Creating a BIOS Boot Partition on a GPT system
1070
1071
<pre>
1072
$ sudo parted /dev/sda
1073
(parted) mkpart primary 0 1024k
1074
(parted) set 2 bios_grub on
1075
</pre>
1076
1077 2
h2. Actiontec Router
1078
1079
* http://transition.fcc.gov/oet/ea/fccid/
1080
* http://opensource.actiontec.com/mi424wref.html
1081 1
1082
h2. Temp
1083
1084
https://www.grumpyland.com/blog/183/installing-software-raid-on-centos-567-via-ssh/
1085
<pre>
1086
# swap is on /dev/md1
1087
/dev/md1 none            swap    sw              0       0
1088
1089
# storage is on /dev/md0
1090
/dev/md0        /storage        xfs     noatime,barrier=0 0 0
1091
//faramir/production/sw /sw     cifs    username=samba,password=w00tw00t!,file_mode=0666,dir_mode=0777  0       0
1092
</pre>
1093
1094
----
1095
[[../|Back home]]