[{"content":"Update: This is no longer the case. Google voice app now has a multi-select and delete button\nIf you wanted to delete a bulk of messages in google voice, you\u0026rsquo;re out of luck. Once you select multiple messages, it doesn\u0026rsquo;t show you a delete button. Only the archive button.\nYou have to open individual messages and select delete from the drop-down and click a confirmation box for every single message. But, if you want to delete multiple entries of anything else, say voicemails, you can do so.\nWhy does Google do that? Clearly it\u0026rsquo;s not the lack of imagination or ability. This is by design, and I don\u0026rsquo;t know why they would make it extremely difficult for us to get rid of messages. I don\u0026rsquo;t know what they use these messages for. I have sent a \u0026ldquo;feedback\u0026rdquo; and wrote that in a review of the App in play store as well. There\u0026rsquo;s no response.\nCurrent \u0026lsquo;Solution\u0026rsquo; When I search for this online, the solutions are either to delete you account and recreate it or making API calls from python. There are also some suggestion to go to \u0026lsquo;Legacy Google Voice\u0026rsquo; and do it, but now it has only the settings page in legacy mode.\nSelenium So I created a simple script with Selenium automation to open Google Voice page in a browser and delete messages one by one. It\u0026rsquo;s easier to modify if google changes the API or the UI design in the future. Here is the code. Enjoy.\n[\njsixface/GoogleVoiceDeleter\nContribute to jsixface/GoogleVoiceDeleter development by creating an account on GitHub.\nGitHubjsixface\n](https://github.com/jsixface/GoogleVoiceDeleter)\nCode to delete google voice messages\n","permalink":"https://arumugam.net/deleting-multiple-messages-from-google-voice/","summary":"\u003cp\u003e\u003cstrong\u003eUpdate:\u003c/strong\u003e This is no longer the case. Google voice app now has a multi-select and delete button\u003c/p\u003e\n\u003cp\u003eIf you wanted to delete a bulk of messages in google voice, you\u0026rsquo;re out of luck. Once you select multiple messages, it doesn\u0026rsquo;t show you a delete button. Only the archive button.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/content/images/2021/02/messages.png\"\u003e\u003c/p\u003e\n\u003cp\u003eYou have to open individual messages and select delete from the drop-down and click a confirmation box for every single message. But, if you want to delete multiple entries of anything else, say voicemails, you can do so.\u003c/p\u003e","title":"Deleting Multiple Messages from Google Voice"},{"content":"To generate keypair :\ngpg --gen-key Listing: To list all public keys\ngpg --list-keys gpg -k To List private keys -\ngpg --list-secret-keys gpg -K Encrypt/Decrypt: The option -a is for armor (Base64 output)\nTo encrypt gpg -a -e -r \u0026lt;recipient\u0026gt; [file]\nTo decrypt gpg -a -d [file]\nSign: To create a signed version of the file gpg [-a] -s \u0026lt;file\u0026gt;\nTo create a separate signature gpg --detach-sign -a \u0026lt;file\u0026gt;\nVerify and decrypt are the same thing. Or use the specific verify option\ngpg --verify file.asc file\nExport: To export a public key: gpg --export -a \u0026lt;id/email\u0026gt;\nTo export a secret key: gpg --export-secret-keys -a -o \u0026lt;outfile\u0026gt; \u0026lt;id/email\u0026gt;\nImport: To import a key: gpg --import \u0026lt;key.gpg\u0026gt;\n","permalink":"https://arumugam.net/gpg-cheatsheet/","summary":"\u003cp\u003eTo generate keypair :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egpg --gen-key\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"listing\"\u003eListing:\u003c/h2\u003e\n\u003cp\u003eTo list all public keys\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egpg --list-keys\ngpg -k\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo List private keys -\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egpg --list-secret-keys\ngpg -K\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"encryptdecrypt\"\u003eEncrypt/Decrypt:\u003c/h2\u003e\n\u003cp\u003eThe option \u003ccode\u003e-a\u003c/code\u003e is for armor (Base64 output)\u003cbr\u003e\nTo encrypt \u003ccode\u003egpg -a -e -r \u0026lt;recipient\u0026gt; [file]\u003c/code\u003e\u003cbr\u003e\nTo decrypt \u003ccode\u003egpg -a -d [file]\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"sign\"\u003eSign:\u003c/h2\u003e\n\u003cp\u003eTo create a signed version of the file \u003ccode\u003egpg [-a] -s \u0026lt;file\u0026gt;\u003c/code\u003e\u003cbr\u003e\nTo create a separate signature \u003ccode\u003egpg --detach-sign -a \u0026lt;file\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVerify and decrypt are the same thing. Or use the specific verify option\u003cbr\u003e\n\u003ccode\u003egpg --verify file.asc file\u003c/code\u003e\u003c/p\u003e","title":"GPG cheatsheet"},{"content":"If you have ever worked with Spring Framework in Java, know the comfort and flexibility of the application configuration that comes with Spring.\nHave the configuration stored in properties or YML files Overriding default configuration based on profiles Overriding that with environment variables Adding to these it also has other \u0026lsquo;springy\u0026rsquo; features like value injection and couple of other property sources. But if you need a small, light weight, handy application you definitely don\u0026rsquo;t want to go with a spring boot application. Spring-boot apps are known to have a delayed startup and leaves you with a bulky jar.\nI searched for a light-weight configuration option which has the ease of Spring but not bulky or slow. I couldn\u0026rsquo;t find any so I wrote one. Here\u0026rsquo;s a simple implementation with the most basic features\nTo YAML from a file with the help of SnakeYAML To access the keys using the dotted notiation. Get it This project is hosted in GitHub and artifacts are available in maven repository. You can include this in your maven project as:\n\u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;com.github.jsixface\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;yamlconfig\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;1.0\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; Usage Let\u0026rsquo;s take an example config.yml as below:\nservices: db: image: mysql container_name: mysql_db endpoint: - host: example.com port: 2976 - host: example.com port: 2978 Now to load it into code, pass a reader or an inputstream of the config file to the constructor of YamlConfig.\nInputStream resource = getClass() .getClassLoader() .getResourceAsStream(\u0026#34;config.yml\u0026#34;); YamlConfig config = YamlConfig.load(resource); Once you have an instance, you can access the values by dotted notation. You can even access array elements.\nString imgName = config.getString(\u0026#34;services.db.image\u0026#34;); String host2 = config.getString(\u0026#34;services.endpoint[1].host\u0026#34;); Future Even though the functionality is very basic, I believe this will suffice for a small projects. The future versions will have some more nice features like overriding using environment variables and system properties.\n","permalink":"https://arumugam.net/java-config-with-yaml/","summary":"\u003cp\u003eIf you have ever worked with Spring Framework in Java, know the comfort and flexibility of the application configuration that comes with Spring.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHave the configuration stored in properties or YML files\u003c/li\u003e\n\u003cli\u003eOverriding default configuration based on profiles\u003c/li\u003e\n\u003cli\u003eOverriding that with environment variables\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAdding to these it also has other \u0026lsquo;springy\u0026rsquo; features like value injection and couple of other property sources. But if you need a small, light weight, handy application you definitely don\u0026rsquo;t want to go with a spring boot application. Spring-boot apps are known to have a delayed startup and leaves you with a bulky jar.\u003c/p\u003e","title":"Java Config with YAML"},{"content":"I wanted to have a small Linux server at home that can help in a couple of things.\nPlex media server A backup server A Web server Desired Specification Low cost\nThis is more like a hobby project so I wanted to keep the cost really low - like, below $200.\nLess power consuming\nThis server will be up 24/7 all year long. So even 1 watt-hour of power usage translates to 24 x 365 = 8760 watt-hour or 8.76 kWh. The server will just be idle doing nothing for most of the time. Therefore one of the main consideration was that the power consumption when idling should be really low.\nPowerful enough\nSince it is going to host Plex media server, it has to be powerful enough to transcode at least one video at 1080p for one device at a time. The other two use cases are not that CPU intensive. Plex website suggests that,\nVery roughly speaking, for a single full-transcode of a video, the following PassMark scores are a good guideline for a requirement: 1080p/10Mbps: 2000 PassMark and 720p/4Mbps: 1500 PassMark\nCompact size\nThis is just my preference. I wanted it small enough to fit in the entertainment cabinet so that if I needed a monitor for this server, I can simply plug an HDMI cable from the TV. Also, placing in there helps in keeping all the wiring organised along with the PlayStation, TV, and others.\nPart Picking Processor\nWhen talking performance per dollar, I always feel that AMD is much better than Intel. This CPU has the perfect specs I\u0026rsquo;ve been looking for. I was also looking at Intel J1900 and Intel N3700. Though they seem to consume less power they were not powerful enough and expensive than AMD. I went with AMD Athlon 5350 which had the CPU Passmark of 2575 which is more than enough horsepower to convert and stream one movie in FullHD. When I bought this in October 2016, it cost me $34.99 but when I look at the price now, it\u0026rsquo;s somewhere around $75. Wow. The TDP for this one is 25W, but it is going to be idle most of the time. The average power consumption should be very less than that.\nMother Board\nI didn\u0026rsquo;t have many specifications on this one. All I wanted was some USB 3.0 ports, an HDMI port (need it once in a while), Integrated Ethernet card, some SATA 3 ports (for possible future hard disk), UEFI, and of course, compatibility to the AMD Athlon 5350. Asrock AM1B fit the bill. Best part: this board cost just $34.99 in newegg.com.\nMemory\nDidn\u0026rsquo;t think much about memory. I just went with a good rated and reviewed DDR3 memory stick in Amazon. 4 GB is more than needed for Linux for our use-case.\nHard Disk\nHere\u0026rsquo;s where I spent more time in deciding things. Do I really need a hard disk? Or even an SSD for that matter? Can I just go with a thumb drive? Ubuntu Server might need about 6-7GB and all the software packages I need might not even make up to 1GB. So for the operating system and the software installed, 32GB is way more than enough. All my data is going to be in an external portable hard drive anyway, which I already use it with my MacBook. When considering the power consumption, a teeny tiny thumb drive must consume less power than an SSD or a hard drive. So I went with a server without a hard drive and used a thumb drive instead.\nCase\nAntec Mini-ITX was the case of my choice after going through a million cases in Amazon. I originally thought either the motherboard or the CPU might be the costliest in this list but to my surprise, this thing cost me $67.29. It was a little crampy inside as I assembled, but once done it was a really small cute server. The full mesh on the side keeps the electronics cool and it helps to save some power.\nOutcome Based on these considerations I landed on the below list of components.\nAMD Athlon 5350 ASRock AM1B-ITX Crucial Ballistix Sport 4GB DDR3 SanDisk Ultra Fit 32GB USB 3.0 Flash Drive Antec Mini-ITX Case ISK110-VESA No Hard drive. I managed to find these components and the total cost came up to a mere $167.48. True story.\nPerformance\nAfter installation of Plex and other software, the computer performed just fine. I was able to stream FullHD 1080p movies to my AppleTV with no issues. Storage utilisation was under 25% on the 32GB thumb drive. Memory usage was also just fine - no swap usage and therefore no paging.\nNow coming to the next important consideration, power consumption, it performed exceptionally well.\nAfter a little bit of tuning, it was able to idle at 15.4 Watts. When watching movies at 1080p, the power consumption was around 23 Watts.\nPowerful for Plex - Achieved Low cost - Achieved Low Power - Achieved Yay.\nI will describe the software stack and power tuning in a different post.\n","permalink":"https://arumugam.net/low-cost-low-power-home-server/","summary":"\u003cp\u003eI wanted to have a small Linux server at home that can help in a couple of things.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePlex media server\u003c/li\u003e\n\u003cli\u003eA backup server\u003c/li\u003e\n\u003cli\u003eA Web server\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"desired-specification\"\u003eDesired Specification\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eLow cost\u003c/strong\u003e\u003cbr\u003e\nThis is more like a hobby project so I wanted to keep the cost really low - like, below $200.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLess power consuming\u003c/strong\u003e\u003cbr\u003e\nThis server will be up 24/7 all year long. So even 1 watt-hour of power usage translates to \u003ccode\u003e24 x 365 = 8760 watt-hour\u003c/code\u003e or 8.76 kWh. The server will just be idle doing nothing for most of the time. Therefore one of the main consideration was that the power consumption when idling should be really low.\u003c/p\u003e","title":"Low cost, Low energy home server"},{"content":"For reference\nShortcuts in Bash\nCtrl + L Clears the screen Ctrl + c Terminate the command Ctrl + R Search command history backwards Ctrl + a go to the start of the command line Ctrl + e go to the end of the command line Ctrl + k delete from cursor to the end of the command line Ctrl + u delete from cursor to the start of the command line Ctrl + w delete from cursor to start of word Alt + b move backward one word (or go to start of word the cursor is currently on) Alt + f move forward one word (or go to end of word the cursor is currently on) Alt + d delete to end of word starting at cursor Alt + c capitalize to end of word starting at cursor Alt + u make uppercase from cursor to end of word Alt + l make lowercase from cursor to end of word Alt + t swap current word with previous !! run last command !word – run the most recent command that starts with ‘word’ Shortcuts Pantheon Terminal\nCtrl + D Closes active tab Ctrl + Shift + W Closes tab Ctrl + Shift + T Opens new tab Alt + \u0026lt;1-9\u0026gt; Jumps to first-ninth tab Ctrl + Plus Increase font size Ctrl + Minus Decrease font size Ctrl + C Copy selected text (if there is nothing selected, it will terminate the current process) Ctrl + V Paste clipboard text Ctrl + Shift + N Open new window Ctrl + Shift + F Open search field Ctrl + Shift + A Select all text Ctrl + Shift + Right Next Tab Ctrl + Shift + Left Previous Tab ","permalink":"https://arumugam.net/shortcuts/","summary":"\u003cp\u003eFor reference\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eShortcuts in Bash\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eCtrl + L\u003c/code\u003e Clears the screen\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCtrl + c\u003c/code\u003e Terminate the command\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCtrl + R\u003c/code\u003e Search command history backwards\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCtrl + a\u003c/code\u003e go to the start of the command line\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCtrl + e\u003c/code\u003e go to the end of the command line\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCtrl + k\u003c/code\u003e delete from cursor to the end of the command line\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCtrl + u\u003c/code\u003e delete from cursor to the start of the command line\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCtrl + w\u003c/code\u003e delete from cursor to start of word\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAlt + b\u003c/code\u003e move backward one word (or go to start of word the cursor is currently on)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAlt + f\u003c/code\u003e move forward one word (or go to end of word the cursor is currently on)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAlt + d\u003c/code\u003e delete to end of word starting at cursor\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAlt + c\u003c/code\u003e capitalize to end of word starting at cursor\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAlt + u\u003c/code\u003e make uppercase from cursor to end of word\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAlt + l\u003c/code\u003e make lowercase from cursor to end of word\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAlt + t\u003c/code\u003e swap current word with previous\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e!!\u003c/code\u003e run last command\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e!word\u003c/code\u003e – run the most recent command that starts with ‘word’\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eShortcuts Pantheon Terminal\u003c/strong\u003e\u003c/p\u003e","title":"Terminal Shortcuts"}]