So, one of the most annoying things IN MY LIFE has been when JetBrains started adding all of this random AI Assistant autocompletes to their IDE’s. I know I’m not alone, because there are even tickets like this one, How to Shut Off All this AI Crap?.
It’s not that I’m anti-AI – I’m anti-Intrusion. When I’m driving the car, I get to drive the car, not the AI Assistant. Unfortunately, the way JetBrains is adding AI into it’s editor feels very intrusive. And, also unfortunately, it’s a slog to go through all of the IDE settings to try and find every single little thing that needs to be turned off.
Luckily, you don’t need to! JetBrains has added some files that will allow you to selectively use AI tools. My favorite is dropping a .noai file in your project root. It’s easy to do, navigate to your project root in Powershell and run touch .noai. That’s it, all you need is an empty file to disable all the AI stuff in PHPStorm.
Now you can get back to PHPStorm Classic mode. LFG? Molten Core? … oops wrong classic mode.
But what about Junie?
That’s a valid question. Like I said, I’m not anti-AI. I actually like the coding agents, I’ve found them extremely helpful in certain circumstances. So, I wondered, will .noai disable all coding agents? Nope! It won’t. As of this writing .noai will disable the AI Assistant features in the IDE – but you can still use the Junie agent window. I don’t know if that’s an oversight or not, I actually recently heard that the Junie agent window is going away as they consolidate underneath the AI Assistant chat window.
The Better Junie Option (imo)
The better option, in my opinion, is to just use the Junie CLI. It’s currently in beta, and appears very usable from my testing. It’s integrated with your current JetBrains AI pricing model, so if you pay to use Junie within your IDE, then you are paying to use the CLI tool as well. I’ve found that I can open my own custom terminal, or use the built in IDE terminal, and open Junie via CLI. This gives me the best of both worlds, a powerful IDE and a powerful coding agent. I can use both when I want.
OK. Honestly, I’m just dropping a quick one in here because it’s necessary. You can easily capture Animated GIFS, Screen Recordings, Animated PNGS on Linux with KDE Spectacle.
Background
Here’s the deal. Windows 10 be complaining that it’s End-of-Life and it won’t run on my laptop anymore and they need me to update my hardware. You know what OS doesn’t need me to update my hardware? That’s right, it’s Linux. So I went ahead and dropped Fedora KDE Plasma Desktop on my laptop and it’s working great. I used Kubuntu years ago and I’m super impressed at how far Linux has come along. There’s pretty much a Linux alternative to all the tools I use, not to mention that a lot of the tools I use are Linux native anyways.
The one thing that I couldn’t quite replicate is ShareX on Linux. I used ShareX on Windows to do the following things:
Capture screenshots
Capture screen recordings
And that’s it. I don’t use any sharing features. Try as I may, I couldn’t find something that would allow me to do that easily in KDE. I tried Flameshot, and it’s pretty cool, but I found it’s not quite as good as what I’m used to with ShareX. My experience is that opening flameshot basically took a screenshot of what’s on my screen and then tried to give me a selection tool. But the way it worked was it offset all my screens so just opening Flameshot made everything on my screen look different.
There’s also a very promising ShareX fork called SnapX. It looks pretty cool, basically like ShareX but for everywhere! However, it’s still very much in active development and I didn’t feel like trying to beta test the tool.
Solution
Enter Spectacle. Yeah, I know what you’re thinking. That’s just a simple screenshot tool, it’s not going to check off both your boxes. But, here’s the thing. It does check off both boxes. The docs don’t tell you about it, nothing published seems to say anything about it, but the ability to capture both a screenshot and a screen recording is legit right there in the interface for Spectacle. (I’ll go ahead and drop in a super grainy picture of my monitor to illustrate).
See – it’s right there. Spectacle gives you the opportunity to take a screenshot or a screen recording, right there with sweet rectangular selection, window, or fullscreen options.
How can you save animated gifs or png’s though? You just need to set that as the output format in Spectacle’s settings. The way I accessed that is by clicking the Options button just to the right of “New Recording” (see above uber grainy screenshot of monitor). From there you can navigate to Video Saving. Right next to the Filename text field there is a file type dropdown. Your options are WebM/VP9, MP4/H.264, Animated WebP (better than GIF), and GIF (compatible, but inefficient). Sweet right?
Important Note: Screenshots are stored in your Pictures/Screenshots folder and screen recordings are stored in your Videos/Screencasts folder.
Here’s a list of the keyboard shortcuts available to use.
KDE Spectacle – Screenshot & Recording Keyboard Shortcuts
Global keyboard shortcuts available in KDE Spectacle for screenshots and screen recording.
Action
Global Shortcut
Global Alternate
Capture Active Window
Meta+Print
Capture Current Monitor
Shift+Print
Capture Entire Desktop
Meta+Shift+Print
Capture Rectangular Region
Meta+Shift+Print
Capture Selected Window
Meta+Ctrl+Print
Launch Spectacle
Print
Meta+Shift+S
Launch Spectacle without capturing
Start/Stop Region Recording
Meta+Shift+R
Meta+R
Start/Stop Screen Recording
Meta+Alt+R
Start/Stop Window Recording
Meta+Ctrl+R
Proof
A Screenshot taken with SpectacleA Screen recording taken with SpectacleAn Animated GIF taken with Spectacle
Final Thoughts
While it was frustrating to find this tool, and that it doesn’t seem to be documented main stream – it’s awesome that it exists and it’s built in to KDE! Props to the Spectacle team.
Get the word out, you can screen capture and screen record right from Spectacle. The tool is awesome 💥
Obviously, I slept in. Planned to leave by 8:20 but woke up at 7:30. We’re out of bread. And my son was going to make a sandwich for lunch. That’s ok, I have time to run to the store and back.
Head out to the car. It’s not unlocking with the button, which is kind of odd. Open it up with the key. The light selector is turned to running lights… oh boy. I forgot to check the knobs after taking the toddler out of the front seat yesterday. I tried to turn the car on. Nothin.
I searched through two of our emergency kits. I have two sets of jumper cables, odd brands of band-aids, flashlights, batteries, foil blankets, cigarette lighter air compressors… but nothing to help me jump my car.
Not a problem, there’s a dude chillin in his truck two houses down. I walked over, he seemed annoyed but drove over to help me jump my car. I open the hood. I can’t find the battery, neither of us can. Where in the heck is the battery on this transit?!
Oh… it’s underneath the drivers seat. You have to literally take the drivers seat out to reach the battery. I apologize to my neighbor for wasting his time. It’s 7:58.
I figure I’d search the internet for how to jump a Ford Transit. Oh – there are specific jumper terminals in the main engine compartment. I found them. Turns out our transit is missing the very noticeable red jumper cable label that points directly to the terminal on most other Transits. It must’ve broken off. Had it been there my neighbor and I (first time I met him by the way) would’ve found it.
Great I found the terminals! But, my neighbor is gone…
I called my brother-in-law, he lives a few minutes away. Asked if he could come jump my car. He could. It would take him a bit to head over. My son probably isn’t going to get his sandwich.
Brother-in-law is here, I glance at the clock. It’s 8:15. Alright, I hope the car jumps. It totally does. Whew! I thank my brother-in-law profusely. He takes off, it’s 8:19. The kids get in the car. We’re out of there by 8:20am and I get the kids dropped off at school on time. My son doesn’t have a sandwich.
Yes, our kids are homeschooled. But for highschool they have a brand new co-op they are going to. They get 1 day of in class lessons from the teacher a week, and the rest of the week is homeschooled.
If only I would’ve “jumped” on a post from my boss 6 years ago 🤣
Anyways, after this whole situation I bought one of these Wolfbox things. Gonna be totally prepared next time. You never know when your toddler will leave your car lights on.
https://amzn.to/3JW5tYe 👈 (this is totally an affiliate link. 😆) 💡Heads up: I may earn a small commission if you buy through this link – at no extra cost to you!
Somewhat recently, I found that my ShareX hotkeys were not working. I tried a number of different things: re-installing ShareX, updating ShareX, and resetting the ShareX hotkey settings. Nothing worked.
And so, since I had more important things to do, I just left the situation alone and manually triggered the ShareX features via the menu when I needed them.
This morning, I attempted to use a ShareX hotkey again. However, I noticed something I’ve never noticed before—a little Logi Options logo appeared on my Windows taskbar for a brief moment. And that got me thinking… what am I doing to trigger Logi Options to show up?
So obviously, I opened up Logi Options. In the settings for my keyboard, I discovered that Print Screen is a configurable key. It was set, at some point, to Screen Capture. While that sounds good—it’s what Print Screen is supposed to do—this actually isn’t good!Screen Capture tells Logi Options to take a screenshot for you. It behaves almost like a native Windows Print Screen, and so it’s hard to notice.
In order to fix your ShareX hotkeys, you need to choose the Print Screen option. This tells Logi Options to get out of the way and treat a Print Screen press like normal.
Ok. I’ve tried it. I’ve attempted to run a RocketChat server on digital ocean for a few years now. My goal was to provide an easy to use alternative to our families group text messages. Group text messages are terrible, they are unorganized, and often times people are left out of the conversation or added into the middle and left wondering “what the heck is going on?!”
I’d remembered looking into RocketChat years ago and decided to give it a try. My family was excited to try this new approach to communication. Right off the bat there was an issue. One of our family members attempted to change their profile picture via the RocketChat app. It didn’t work. So they decided not to use the program, just like that. I’ll say it again, in their first experience with RocketChat, it didn’t work, so they would not use it.
The rest of my family was more forgiving of the program. However, they too had issues. RocketChat was unreliable. My family members would find that they’d been logged out of the app, and so were not getting notifications. They’d have to log back in periodically. That’s annoying for them. So, I lost a few more users.
In addition to these issues, the RocketChat server will randomly stop. The result is that the app and web site will respond with Bad Gateway… Or just not load. I have to then ssh into the server to attempt to restart the service. Sometimes a simple reboot does the trick, other times I have to literally navigate to the RocketChat server directory and manually install npm packages. That’s crazy!
This morning I woke up early to work on a personal project I’ve been excited to work on. However, I spent all of my time trying to figure out how to get RocketChat up and running again. And, after a couple of hours of work, RocketChat still won’t start, and I’ve run out of the time that I had to work on my personal project, I spent it all on RocketChat. That’s incredibly frustrating.
So. I’m pretty much done with RocketChat. I won’t recommend anyone use it. It’s not worth the time investment required. It’s not user friendly. It’s the worst.
I just experienced an issue which took me a day to figure out. So, as per normal, I’m going to document it here so that in the future I don’t have to bother looking it up!
My problem: every time I try to commit using git I am asked for my SSH key passphrase. However, I’ve ensured the SSH agent is running. I can pull from the remote, push to the remote, and do anything with the remote repository without needing to insert my SSH key multiple times. However, when I try to commit via git, I’m asked for my passphrase on every commit. Why is this a problem? Because when I rebase a 150+ branch of commits I’m having to enter my passphrase 150 times consecutively. That’s unsustainable.
Still, even armed with Christopher’s information, I couldn’t figure out how to fix the problem I as running into.
Since this post is meant to help guide me in setting this up from scratch (AGAIN) I’m going to go through all the relevant steps. But if you are just looking for the solution to the problem then skip to here.
Setup
Everyone’s setup is a bit different, but I’m going to document the relevant portions of mine.
Environment
Clean Install of Windows 11
Git Note: When installing I select the “Use Git and optional Unix tools from the Command Prompt”
After my environment is setup, I set up SSH. This involved creating a new key, adding it to the SSH Agent, and making sure the agent was running. I run all these commands from an instance of Powershell Core (installed above).
Adding the key to the agent is simple enough. You just need to run a command and give it the location of the private SSH key you generated in the step above. In my case that’s as simple as:
Now I would either typically restart my computer, or close the current PowerShell Core window and open a new one.
Adding the SSH Key to GitHub
If you want to sign commits with GitHub then you need to upload your SSH key 2wice (that’s a clever way of writing twice). One upload for your “Authentication Key” which will be for access to the repo. The second upload for your Signing Key. You can do both at https://github.com/settings/keys just click “Add Key” in the SSH Keys section and upload one for Authentication and then click “Add Key” again and upload one for Signing.
Signing Git Commits
Once again, referring to Christopher’s post. I do the following, making sure to switch out the path to my pub SSH key:
Ok. Now the problem. You’ve successfully connected to Github and cloned your repo. Now you start making commits and find that you have to insert your SSH key passphrase over and over, despite the SSH agent running.
It took me a long time to figure out, but the problem is likely that you have two versions of SSH on your machine. The one that comes with Windows by default, and the one that came with Git for Windows when it was installed.
To solve this problem, tell Git For Windows to “Use external OpenSSH” when installing Git. The following comes from this answer on Stack Overflow by Ajedi32.
If you used the bundled OpenSSH installation, git will default to that and will not use any keys imported into Windows’ native ssh-agent service. You need to select “Use external OpenSSH” instead when prompted.
If you did not make this selection when installing, you should be able to fix that by just running the installer again.
Previous Versions of this article said the following. This is no longer what I recommend.
You’ll remember we selected the “Use Git and optional Unix tools from the Command Prompt” option. This option will add the referenced Git and Unix tools to your systems Path. The SSH Agent that is registered and used for Authentication is the one that comes installed with windows. The one that Git is using for signing, is the one that comes with git.
The order of the PATH variables will determine which version of the ssh-agent is used. The first version encountered will be the one that windows uses. So, to solve this problem, make sure the C:\Program Files\Git\usr\bin is above the %SYSTEMROOT%\System32\OpenSSH\ in your system path.
I am currently looking into alternative forms of user authorization and authentication. Among the solutions I am looking into is Clerk. It’s pretty sweet and has a lot of cool features baked in. (Although the MFA support is a premium add-on and they aren’t super upfront about that).
One of the issues I ran into while implementing Clerk was a redirect loop. I set my home page within the Clerk Dashboard and when I reloaded my app, boom REDIRECTION FOR DAYS. Clerk was continuing to reload the home page for all eternity.
So, I added an onbeforeunload event into the page with a debugger call inside of it. This paused the page in the inspector before it reloaded and allowed me to actually see what was going on.
It turns out that Clerk was outputting an error message into the console. This error message is pictured below:
The <SignUp/> and <SignIn/> components cannot render when a user is already signed in, unless the application allows multiple sessions. Since a user is signed in and this application only allows a single session, Clerk is redirecting to the Home URL instead. (This notice only appears in development)
? Clerk
Well – ok then. Clerk is redirecting to the Home URL (which is the one it’s already on) and causing a permanent redirect loop. It seems like this would be handled better by simply _not_ loading the SignIn or SignUp components should the conditions for their existence fail.
Hopefully this helps you out! You might consider making your home page and your sign in pages different pages, or conditionally load those components, so that Clerk can be happy and not mess things up.
Do you hate seeing a sliver of light between your monitors? I sure do. I’ve spent a lot of time getting my monitors lined up just right so that they are flush against eachother with no gaps. However, a slight bump of the desk can throw all that hard work out the window.
So, I figured out another solution. Instead of adjusting the monitors to make sure that they are “perfect” I took some black electrical tape and ran it down the seem behind the two monitors. The black tape matches the black border of my monitors and it blocks any light from coming in!
I highly suggest running black electrical tape down the back seem between your monitors. It really helps!
As you might know, I’ve set up a RocketChat server recently on Digital Ocean. So far it’s been working great. An update every once and a while is all it needs.
However, yesterday, I attempted an update that failed. From then on every attempted update resulted in “RocketChat server not running. Cancelling”. This was very frutrating.
First, a few commands to try that might help:
systemctl restart rocketchat.service – This will start your RocketChat server in case it is stopped.
systemctl status rocketchat.service – Use this command to check the results of the previous command. Typically this will report that the service is “Active” if the previous command was successful.
In my case, the second command resulted in a “failed” state. The command itself gave me some information as to what the failure was, but not a lot of context as to what caused the failure. However, it did show me the process that it attempted to run. It said, ExecStart=/opt/nvm/versions/node/v14.19.3/bin/node /opt/Rocket.Chat/main.js (code=exited, status=1/FAILURE).
Alright! We’re getting somewhere. With that I was able to figure out what command failed and where that command was run. I navigated directly to the /opt/Rocket.Chat directory which was where the failure was occurring. From here I ran node main.js. The results of this command were much more helpful. They told me this, Error: Cannot find module '@meteorjs/reify/lib/runtime'. That looks like an issue with npm dependencies.
So, I poked around the Rocket.Chat directory structure and looked for dependencies for the Rocket.Chat server. I found what I was looking for in the /opt/Rocket.Chat/programs/server directory.
From this directory I ran two commands
npm install
npm ci
Afterwards I attempted to start the RocketChat server again using the systemctl restart rocketchat.service command. I checked it with systemctl status rocketchat.service and found that it was working now! RocketChat was back to running normally. The problem with “RocketChat server not running. Cancelling” was gone!
Note – RocketChat is making moves to severely limit their PAAS offering. They have baked in a bunch of limitations in the codebase and now claim that if you self-host you are using their “free version” ?
RocketChat (https://rocket.chat) is a chatting tool similar to MatterMost and Slack. It offers a self-managed community edition as well as some paid plans and is in active development. I’m just learning how to use it, so I’m planning on documenting my journey here.
I installed and set up RocketChat installed in a matter of minutes. The QuickStart guide, though short, includes most of what you need to get up and running.
To get started with your RocketChat instance on DigitalOcean you need to:
Create an A Record that points to your Digital Ocean Droplet. *
Setup your Let’s Encrypt certificate. rocketchatctl configure --lets-encrypt --root-url=YOUR_DOMAIN --letsencrypt-email=YOUR_EMAIL
Update your RocketChat installation. Run the following commands from your droplet command line interface.
Run sudo rocketchatctl upgrade-rocketchatctl
Run sudo rocketchatctl update
* I use Cloudflare to host my DNS. In this case I had to disable the proxying on the A Record in order to allow RocketChat to work correctly.
Now visit your site (you should not run into any problems) and create your administration account.
One Note
From time to time the Rocket Chat server responds with “Bad Gateway”. I’m not sure exactly why. However, a DigitalOcean droplet can be restarted by using the reboot command from the command line interface.