Project

General

Profile

Miscellaneous » History » Version 18

Anonymous, 03/22/2024 09:46 AM
adding note

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