Friday, November 5, 2021

Recent Questions - Unix & Linux Stack Exchange

Recent Questions - Unix & Linux Stack Exchange


unregistered encryption protocol 'application/pgp-encrypted'

Posted: 05 Nov 2021 09:42 AM PDT

I have an application that uses gmime3 (through the function g_mime_multipart_encrypted_decrypt) to decrypt a message, but I am getting the error

unregistered encryption protocol 'application/pgp-encrypted'  

It seems the the mimetype application/pgp-encrypted needs to be registered somehow. But how do I do this?

If I execute a mimetype encrypted.gpg on an encrypted file I correctly get the mimetype application/pgp-encrypted and /etc/mime.types contains an entry for application/pgp-encrypted.

PS: I installed gpg2 from source not from a package manager. Using a package manager is not an option for me.

How to make GRUB on HD boot a bootable USBDrive or from a `.iso` on USBDrive?

Posted: 05 Nov 2021 09:36 AM PDT

I'm currently struggling with a project where I need to make it boot from a bootable USBDrive using GRUB. (alternatively I could make a NTFS USBDrive with the raw .iso file) When I enter GRUB's command line it can't see the USB there, I only see the HD (hd0) and the main partition (hd0,msdos1).

I already tried just guessing and creating a menuentry for (hd1,..), but as you may expect, this didn't work.

Keep in mind that I can't just change the boot sequence on the BIOS itself, even though BIOS recognizes the USBDrive.

Am I missing something? Should GRUB already recognize it automatically? I'm totally open to new ideas.

PS: Even though I'm not using Ubuntu, here they explain how to do something pretty similar to what I want.

PS2: It's a UEFI system.

How do I return an element from a bash array using a partial string match?

Posted: 05 Nov 2021 10:08 AM PDT

I have a bash array containing several elements, only one of which will be in the format nn.wr , where nn is a variable integer.

eg

array=( "abcd" "01.wr" "ef_gh" )  

However it could be anywhere in the array. How can I find it and return it? I was trying to use the partial match *.wr but can't quite get sed or awk to do it.

There must be a way!!

dd not making usb bootable

Posted: 05 Nov 2021 09:24 AM PDT

I'm trying to create a centos 7 install usb but for some reason dd does not make the usb bootable. I've used the following:

$ lsblk  NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS  fd0      2:0    1     4K  0 disk   sda      8:0    0 298.1G  0 disk   ├─sda1   8:1    0   100M  0 part   ├─sda2   8:2    0 160.9G  0 part   ├─sda3   8:3    0     1K  0 part   ├─sda4   8:4    0  90.5G  0 part   ├─sda5   8:5    0   7.6G  0 part [SWAP]  └─sda6   8:6    0    39G  0 part /  sdb      8:16   1     0B  0 disk   sdc      8:32   1     0B  0 disk   sdd      8:48   1     0B  0 disk   sde      8:64   1     0B  0 disk   sdf      8:80   1  29.3G  0 disk   sr0     11:0    1  1024M  0 rom  

I'm trying to put it on sdf and it's not mounted. I'm using the command

$ sudo dd bs=4M if=/home/user/Desktop/CentOS-7-i386-Everything-2009.iso of=/dev/sdf conv=fdatasync  status=progress  8287944704 bytes (8.3 GB, 7.7 GiB) copied, 1027 s, 8.1 MB/s  1976+1 records in  1976+1 records out  8291639296 bytes (8.3 GB, 7.7 GiB) copied, 1125.72 s, 7.4 MB/s  

I'm really stumped. I've successfully created and booted from a usb made with this method on the same PC a lot of times. I don't get it. What am I doing wrong?

Syntax highlighting combinations of strings and comments in nano

Posted: 05 Nov 2021 09:24 AM PDT

I was wondering if anyone could tell me if it possible to configure syntax highlighting in .nanorc so that in the following text ...

Dim s$ = "foo ' bar" ' bar "foo"  

... the string "foo 'bar" is all highlighted one colour and the trailing comment ' bar "foo" is highlighted another.

If I do this:

# Comments.  color yellow "'.*"    # Strings  color brightmagenta ""(\\.|[^"])*""  

Then I get this:

Image1

And if I do it in the other order:

# Strings  color brightmagenta ""(\\.|[^"])*""    # Comments.  color yellow "'.*"  

Then I get this:

Image2

can't mount hard drives, fdisk command says "Partition 1 does not start on physical sector boundary."

Posted: 05 Nov 2021 09:20 AM PDT

edit nvm i fixed it delete this post please

Restoring /home/etc to /etc

Posted: 05 Nov 2021 09:10 AM PDT

I need to copy backup files from /mnt/backup/etc to /etc so cp/mnt/backup/etc* is the command I am thinking of.

However, experience is teaching me cp/mnt/backup/etc* may be a destructive command to the filesystem because there maybe differences in files from repos that are not on this fresh install of CentOS7 version but are in /mnt/backup/etc* or other differences I am not aware of.

I am thinking of a command that will compare files of both directories and output if a difference in the file exists. From there I can determine which files from /mnt/backup/etc to not restore if any.

Not sure how to do this, it's been a while. I think I use the wc command to output the difference between the files but not certain on how to compare the differences between two files.

Kubelet fails to pull any image

Posted: 05 Nov 2021 08:49 AM PDT

I tried deploying this image from docker hub onto a pod in my lab. The pod gets stuck on "ContainerCreating" and when I run kubectl describe pod, I see the following in loop

  Normal   Pulling                17s   kubelet, 192.168.86.201  pulling image "hello-world"    Warning  Failed                 17s   kubelet, 192.168.86.201  Failed to pull image "hello-world": rpc error: code = Internal desc = transport is closing    Warning  Failed                 17s   kubelet, 192.168.86.201  Error: ErrImagePull    Normal   SuccessfulMountVolume  17s   kubelet, 192.168.86.201  MountVolume.SetUp succeeded for volume "default-token-vrnjz"    Warning  Failed                 6s    kubelet, 192.168.86.201  Error: ErrImagePull    Normal   SuccessfulMountVolume  6s    kubelet, 192.168.86.201  MountVolume.SetUp succeeded for volume "default-token-vrnjz"    Normal   Pulling                6s    kubelet, 192.168.86.201  pulling image "hello-world"    Warning  Failed                 6s    kubelet, 192.168.86.201  Failed to pull image "hello-world": rpc error: code = Internal desc = transport is closing  

I tried running docker pull from the node:

docker pull hello-world  Using default tag: latest  latest: Pulling from library/hello-world  Digest: sha256:37a0b92b08d4919615c3ee023f7ddb068d12b8387475d64c622ac30f45c29c51  Status: Image is up to date for hello-world:latest  

Install kernel 5.15.0 on Ubuntu 18.04

Posted: 05 Nov 2021 08:38 AM PDT

I installed the newer 5.15.0 kernel onto my Linux Mint 19.3 (Ubuntu 18.04) by https://github.com/pimlie/ubuntu-mainline-kernel.sh .

All worked fine, but not for kernel headers which gave me an installation error due to the expected LIBC version that must be >= 2.34, instead of Ubuntu 18.04 that is shipped with the 2.27.

Is is possible to solve this issue without compromise the system stability?

Thank you so much!

can mergecap be modified to allow listing the source files?

Posted: 05 Nov 2021 07:25 AM PDT

I realize mergecap is relatively old. I checked the mergecap docs page, googled, etc., and do not see any mention of a mergecap capability that I believe would be beneficial.

When we mergecap, we specify the input files and any switches (ex. -a) to use in creating the merged file. Consider that I have 3 files, a.pcap, b.pcap and c.pcap and I merge a and b, but not c. Obviously, the 3 file scenario is for example usage only, and we often have datasets with dozens of possible sources.

It would be very helpful if the resultant .pcapng file could be queried via mergecap to tell us what files were sourced to get the ng file.

Maybe -S, or such.

Agree/disagree? Should I log an enhancement request?

How do I access my files from PMBR disk

Posted: 05 Nov 2021 08:56 AM PDT

I was creating a partition on my external hard disk via the 'Disks' app in Linux mint and I accidentally changed the partition scheme. Now the disk is not recognised in either Windows or Ubuntu and in the disks app it shows unallocated space.. How can I fix this

enter image description here

Wipe entire windows OS from all disks to boot linux

Posted: 05 Nov 2021 07:44 AM PDT

I have been running Linux in a dual booting setup and on a separate machine for around 6 months now. I have found my brother's old computer and have been given permission to wipe it and put in Linux.

I was wondering how I can completely erase all trace of Windows from my SSD so I can boot it with a USB.

find/detect file name goups

Posted: 05 Nov 2021 08:13 AM PDT

On fs i have files like: PREFIX_GROUPNAME_OTHERNAMES[.txt|.*]

eg:

A_ABC_A.txt  A_ABC_B.txt  A_ABC_C.txt  A_XYZ_A.txt  A_XYZ_B.txt  A_XYZ_C.txt  

For some futher tasks i want to get the group names.

$# command i'm looking for  result:  > ABC XYZ  

I know the name structure not the group names.

idea (but seems to be very expensiv! (on large listings):

  • scan all files
  • split names , create lists by goups names
  • return groups

find and awk maybe tr seems to be what im lookin for while finding a solution here

EDIT:

This gives a NOT UNIQUE list:

find ./ -iname '*.txt' | xargs -n 1 | cut -d '_' -f 2  > ABC  > ABC  > ABC  > XYZ  > XYZ  > XYZ  

Fix disk and volume manager configurations for a cloned server

Posted: 05 Nov 2021 09:07 AM PDT

I have cloned a physical server that has Enterprise Linux version 5.1.19.6 as the operating system with Clonezilla to a VMware virtual machine and the cloning completed successfully. However, I noticed two interesting messages during the cloning process.

  • The first one was on the physical server and it said something like "pv uses old naming format".
  • The second one on the destination virtual machine after the completing the cloning said "clonezilla couldn't run the command update initramfs because it was not found".

I thought everything finished smoothly until I rebooted the virtual machine. When the machine starts I get this error and it doesn't reboot.

enter image description here

I'm not new to Linux but I'm not an expert either. So, from this message I figured out that the problem is GRUB can't find VG where the system is located. So, I started to search but i didn't find any helpful information and also tried many fixes but they all failed. Then I used a live cd to enter the hard drive to see if i can fix it manually which I believe it is the first step to the right solution. Now I will explain the scenario that is happening. on the physical server (the source) the hard drive is partitioned as follows:

/dev/cciss/c0d0      /dev/cciss/c0d0p1     (for boot)      /dev/cciss/c0d0p2     (linux lvm)  

The PV is already created and linked to c0d0p2. Under the PV there is a VG called VolGroup00 which contains 4 LVs (LogVol00 etc...). I will focus only on the first LV which contains the system. This LV mounted to the root directory "/" in the fstab file as follows:

/dev/VolGroup00/LogVol00          /    # I remembered the first message on the server from clonezilla that the PVs use old naming.  

Grub conf file system also uses this file as root for kernel command. So, I figured out that the problem is related to the hard disk configuration because the new virtual machine has different specifications. So, I tried to change the grub configuration file and fstab file by using rescue mode through a live cd on the virtual machine but it didn't work and i think the system still needs more things to be configured. However I noticed on the live cd when I run pvs or vgs or lvs the commands print the old information that I can get from the source server but when I change the root(chroot /mnt/sysimage) the commands don't print anything. and I ran lsblk and this what I get:

enter image description here

I'm sorry for taking so long to explain the problem but I should be precise. So, I have a couple of questions:

  1. Is this problem related to the update-initramfs -u command? If yes, should I run it on the live CD or after chroot /mnt/sysimage And what should I do if the command can't be found on the system.

  2. If the live cd was able to mount the LV to /mnt/sysimage, how can I mount LogVol00 to the root directory in /dev/sda2 if that is the problem?

  3. When I run pvs in the live cd shell it prints the PVs but when I change the root to /mnt/sysimage the command doesn't show them. What should I do to fix that?

System unresponsive after mounting /dev/sdc2 on /

Posted: 05 Nov 2021 08:50 AM PDT

So, I tried to mount a hard disk /dev/sdc2 on / directory in my Ubuntu workstation, and upon mounting, I am not able to remote into the Ubuntu workstation anymore. The exact command I run to mount is

sudo mount /dev/sdc2 /  

I am not sure what has gone wrong, but I thought mounting a hard disk on / directory is fine. From what I read, it does not erase all the files and folders in / directory.

I was so anxious and I am only allowed to return to office to unplug the hard disk to see whether I can remote into my Ubuntu workstation again after unplugging. Any insight into this issue is much appreciated! :)

Kill all of my processes that were started within the past hour?

Posted: 05 Nov 2021 08:07 AM PDT

How do I kill all processes with my username that were started within (past hour, past day) etc?

Run script on login

Posted: 05 Nov 2021 09:17 AM PDT

I have a Minecraft server running on OS Ubuntu Server 20.04.3 with systemd.

I need to create a user called shutdown which, on login (even from ssh) should:

  • Run script shutdownAll
  • Log out from session

The shutdownAll script should be the following (or equivalent):

systemctl stop minecraft  shutdown +5 "SERVER SHUTDOWN IN 5 MINUTES"  

Any ideas to do it?
EDIT: I've thought about using a command as shell, but how do I execute two commands?

After updatimg to bullseye enter did not work on login screen

Posted: 05 Nov 2021 07:27 AM PDT

Yesterday I tried to update buster to bullseye. All work as expected until I reboot my laptop.
Booting is working, start kde, invite me to insert password, but, enter did not working. So I could not input password.
What I discover:

  1. Enter did not work with another keyboard.
  2. Enter did not work on numpad.
  3. Enter work in grub menu.
  4. Enter work in console.

Help me, please.

Number of Open Files - soft nofile vs ULIMIT

Posted: 05 Nov 2021 09:55 AM PDT

vendor software configuration requires these settings on our Linux server:

xerox soft nofile 16384  xerox hard nofile 262144  

in file

/etc/security/limits.conf  

Because of security consideration is it possible to replace these configuration in the user bash_profile?

can I use

ulimit -n 262144  

in

/home/xerox/.bash_profile  

Will it be the same?

Thank you!

remove trailing spaces from text files ONLY when necessary

Posted: 05 Nov 2021 09:26 AM PDT

I'm removing the trailing spaces using

sed -i 's/[ \t]*$//' *.txt  

However, this command will rewrite all the files.

Is there a convenient way to judge that if there are trailing spaces in a text file and skip those without trailing spaces?

baseDN on ldapsearch vs ldapadd

Posted: 05 Nov 2021 08:40 AM PDT

I am learning to use OpenLDAP and I can not understand why you need to specify a base dn to search in the ldap tree but you do not need it in order to add stuff

ldapsearch -x -b "dc=foo,dc=local"  ldapadd -x -W -D "dn=admin,dc=foo,dc=local" -f ou.ldif  

Can somebody explained me the difference?

Linux 4.19: apply devicetree overlay on live system

Posted: 05 Nov 2021 07:33 AM PDT

Is it possible to apply a devictree overlay on a live system? We have an embedded system that has some optional hardware. We would like to load the devicetree information after Linux booted.

Reqaon for this: our additional hardware uses a I2C bus to configure itself created by another component on an SPI bus. Unfortunate, the communication between our cpu and optional hardware is going over SPI.

Since a devicetree is "worked off" in chronological order, we cannot "go back" to the SPI bus after initializing our I2C bus.

I already tried to mount configfs, did not work and is not recommended in prouction environments.

Thanks in advance

cp setattrlist Permission denied on MacOS

Posted: 05 Nov 2021 09:09 AM PDT

I am a second "Administrator" user on a Mac OS. I am in the admin group, and am trying to use homebrew, which was installed by the first user.

I have made sure everything in /usr/local/* is writable by admin, i.e. sudo chmod -R g+w /usr/local/*.

When trying to run brew install a few different packages, I get a few of these errors

cp: setattrlist: /usr/local/Cellar/openssl@1.1/.: Permission denied  cp: chmod: /usr/local/Cellar/openssl@1.1/.: Operation not permitted  Error: Failure while executing; `cp -pR /private/tmp/d20210523-60782-14t7vu8/openssl@1.1/. /usr/local/Cellar/openssl@1.1` exited with 1. Here's the output:  cp: setattrlist: /usr/local/Cellar/openssl@1.1/.: Permission denied  cp: chmod: /usr/local/Cellar/openssl@1.1/.: Operation not permitted  

But upon inspecting, the folder has the permissions I expected

:; ls -al /usr/local/Cellar/icu4c/  total 0  drwxrwxr-x  3 user1 admin   96 May 23 14:06 .  drwxrwxr-x 73 user1 admin 2336 May 23 14:05 ..  drwxrwxr-x 12 user1 admin  384 May 23 14:06 67.1  

Does anyone know what I might be missing here?

How can I use the output of a command without using the mouse?

Posted: 05 Nov 2021 07:39 AM PDT

Imagine you issued a find command and now you want to use one line of the resulting output as an argument.

$ find ..  fileA  fileB  $ vi <CURSOR>   # now do what to achive:  $ vi fileB        

Current workaround: Double click on fileB (selection is extended automatically) and press middle mouse button (paste on X). Works but uses the mouse.

Possible solutions:

  1. Tab completion — Works in most shells but only for files.
  2. Hook the shell — Like scm_breeze; This is pretty much what I seek, but it's limited to git.
  3. Use screen — Pretty close, but still many key strokes. And it needs screen....
  4. store output in bash variable (GMaster) — That would only work if the find command outputs one line. How do I access the second line like in the example?
  5. pipe command to editor (jasonwryan) — Works but executes the command twice. That may be time consuming or not even possible.
  6. use emacs Dynamic Abbrev Expansion (Arkadiusz Drabczyk, Michael Vehrs) — Thats what I am looking for but I would not like to start with emacs.

Solution for me: "Dynamic Abbrev Expansion". Now I have the name of this feature I was looking for. I will start a new question about how to get his "dabbrev-expand" in other software's:

https://unix.stackexchange.com/questions/281298/list-of-sofwares-inspired-by-emacs-dabbrev-expand.

Vision of the best solution for me: Something like the hint mode from vimperator or easymotion in Vim, to yank text from the output of the current terminal.

Join two files each with two columns, including non-matching lines

Posted: 05 Nov 2021 09:28 AM PDT

I'm trying to match and merge two sets of sorted data, one set per file. Each file contains two columns: the key field and the associated value. The resulting output should contain three columns: the key field, the value (if any) from the first file, and the value (if any) from the second file. I need to include lines of data that are not matched.

First file "john"

apple,green  cherry,red  orange,orange  

Second file "jane"

apple,red  banana,yellow  cherry,yellow  kiwi,green  

Desired result

apple,green,red  banana,,yellow  cherry,red,yellow  kiwi,,green  orange,orange,  

I thought initially that this was a trivial job for join

LC_ALL=C join -j1 -a1 -a2 -t',' john jane  

But the result of the -a1 -a2 puts the unmatched value always in the second column:

apple,green,red  banana,yellow  cherry,red,yellow  kiwi,green  orange,orange  

I need to be able to see from which source file the unmatched value originates, ideally by having those values in the appropriate second or third column of the result file, but I cannot work out a simple way of achieving this without descending into awk ... getline() type constructs.

Any suggestions, please?

Heartbeat not working. Port not opened

Posted: 05 Nov 2021 08:06 AM PDT

I have been trying to place two virtual machine with heartbeat. osboxes and osboxes2.

When I run nmap localhost this is the output:

Nmap scan report for localhost (127.0.0.1)  Host is up (0.00017s latency).  Not shown: 991 closed ports  PORT      STATE SERVICE  22/tcp    open  ssh  25/tcp    open  smtp  53/tcp    open  domain  80/tcp    open  http  443/tcp   open  https  631/tcp   open  ipp  3306/tcp  open  mysql  9050/tcp  open  tor-socks  10000/tcp open  snet-sensor-mgmt  

Here is the tcpdump of such interface eth0:

18:38:22.267817 IP 192.168.141.135.48748 > 192.168.141.255.694: UDP, length 315  18:38:22.268640 IP 192.168.141.135.38234 > osboxes2.694: UDP, length 315  18:38:22.269421 IP osboxes2 > 192.168.141.135: ICMP osboxes2 udp port 694 unreachable, length 351  

As you can see udp port 694 unreachable. When i try to ping osboxes from osboxes2:

PING 192.168.141.137 (192.168.141.137) 56(84) bytes of data.  64 bytes from 192.168.141.137: icmp_seq=1 ttl=64 time=0.284 ms  64 bytes from 192.168.141.137: icmp_seq=2 ttl=64 time=0.291 ms  64 bytes from 192.168.141.137: icmp_seq=3 ttl=64 time=0.681 ms  

ha.cf file from osboxes:

#Arquivo de log de debug:  logfile /var/log/ha-log    #Arquivo de log  debugfile /var/log/ha-debug    #Para onde vai os logs  logfacility local0    #Frequencia em segundo de batimentos cardicados  keepalive 2    #Tempo indica a morte do node  deadtime 25    #Tempo que o heartbeat deve esperar por beats (nao o beat dos beatboxes)  warntime 10    #Tempo maximo para declarar o outro servidor morto  initdead 50    #Porto de sincronia  udpport 694    #Endereco de broadcast da rede  bcast eth0    #Nao entendi. Se for preciso vai la procurar depois.  ucast eth0 192.168.141.137    #Determinar se o servidor volta para o master caso ele responda  auto_failback on    #Nome dos nodes do cluster  node osboxes2  node osboxes  

haresourcers from osboxes:

osboxes 192.168.141.135 apache  

It's worth noting that osboxes(principal node) is 192.168.141.135 and osboxes2 is 192.168.141.137.

I guessing the problem resides in the port 694 not opened since it is unreachable.

Disable bridge module insert?

Posted: 05 Nov 2021 10:00 AM PDT

I have Fedora 20 setup with default kernel configuration, where bridge feature is enabled as a module (CONFIG_BRIDGE=m), and the bridge module loads as the system starts. I don't understand who initiates it, since I have not found anything about bridge.ko in /etc/sysconfig/modules/*. However it ends up in the memory and every time I have to 'rmmod' it.

I would like to prohibit loading of the bridge.ko on the start up, yet I still want to manually load/unload bridge.ko whenever necessary.

I know it is possible to use the blacklist feature in /etc/modprobe.d/blacklist.conf, but can anybody point out who is loading bridge.ko in default setup of Fedora 20?

Is there a more elegant way to unlink two tmux clients sharing a session from inside tmux?

Posted: 05 Nov 2021 09:03 AM PDT

This is almost a code-review question, but very *nixy and more about configuration than code. For years since I switched to tmux from screen I've had a couple of nagging issues that I could not make work the way I wanted them to. Since I setup my shell to exec into a tmux session I finally decided it was time to fix this one.

By default when you attach two tmux clients to the same session, they are locked together. Switch panes in one and both switch in sync. This is different from screen where the default behavior was a shared set of panes but the client itself was independent.

What I've wanted was a way to un-bind two tmux clients attached to the same session. This is easy enough to do if you are outside of tmux and launching a new client. Just start a new session with a reference to the parent one:

tmux new-session -t original_session -s new_session  

However try do do this after you are in a client and want to unlink it from whatever other client is sharing that session and things get more complicated. I tried dozens of ways and never hit on one that worked well. The closest I got was using bind <key> prompt-command ... to prompt for both the old and new session names. For whatever reason tmux does not expand the #{session_name} variable inside arguments for a new-session or prompt-command. It does in arguments to many other commands (e.g. I use it in run below) but without that expansion this particular task becomes suddenly complicated. Even with manually entering the values, it only ever sorta worked.

Today I finally got it to work. The result, however, is uglier that I would have liked. It requires a shell function to do most of the magic. In order to contain this to just the config file without involving external scripts (for dotfile portability) I'm using a hack. The config, if you crop off the first two columns, is actually executable as a shell script. With everything wrapped in functions, you can call just the part of the script you need from any keybinding. The shell script bits are comments in the config, while in shell script made the config bit is discarded with a here-doc.

Todays solution came out something like this (my full .tmux.conf file):

# : << ENDOFCONF    # Clear the default binding  unbind C-c  # Pass the name of the current session to a function to clone it  bind C-c run "cut -c3- ~/.tmux.conf | sh -s clone #S"    # ENDOFCONF  # clone () {  #   orig=${1%-*}  #   copy="$orig-$(($( tmux list-sessions -F '#S' | sed -nE "/^${orig}-[0-9]+$/{s/[^0-9]//g;p}" | tail -n1 )+1))"  #   TMUX= tmux new-session -d -t $orig -s $copy  #   tmux switch-client -t $copy  #   tmux set -q -t $copy destroy-unattached on  # }  # $@  

Mind you this works. From a running tmux client, Ctrl+B Ctrl+C creates a new session with a number appended to the name of the current one, uses the current one as a target for the panes, and switches to it.

I'm happy with this except for the nagging idea that I've just made something simple much more complex than it needs to be. Is there a simpler way to achieve this?

No comments:

Post a Comment