[–] [S] 1 point 4 weeks ago

Ok, that cleared up a lot of it. I guess I then turn the compass around to use the arrow, or simply flip the mirror flat and use its line as the "direction of travel", but for the purposes of triangulating my position it seems I just need to do everything normally and then just read the green number instead of the black one, then account for declination and thats the bearing of the target to me.

Thanks for the vid :)

  • source
  • parent
  • context
  • [–] [S] 4 points 4 weeks ago (4 children)

    Yea, its adjustable and I have the declination on the map of the area I'll be hiking at printed, but thats not what I mean exactly. This compass is cheap so it obviously doesnt have a declination adjusting screw or anything like that, so Ill be accounting for it manually each reading I take, but what I mean is, isnt the direction of travel arrow on the wrong side of the compass? Regardless of any declination, the magnetic reading I will read would be the reverse of where I want to go, no? Obviously its not shown in the image, but of course the mirror wouldnt be laid out flat like that, Id adjust it until I could see my target through the hole, and align the line-gap with the mounting point of the needle to the compass, and do everything else needed.

    This image maybe shows what I mean better. If my target where I want to go is at the "top" of the image, and I am at the "bottom", doesnt the index line and direction of travel arrows indicate the opposite direction after I sight the target, and account for declination manually if any.

  • source
  • parent
  • context
  • [–] 3 points 1 month ago

    I had some delicious chicken noodle soup the other day, and I won't lie, I've been thinking about it ever since, the same way you think about that total stranger you pass on the street but immediately fall in love with despite not interacting at all

  • source
  •  

    Hello everyone!

    I won't drag the post out too much since most of the info is already in the title, but I would love to hear some suggestions for some children's books to help me develop comfort with, and vocabulary in Dutch.

    In terms of my level with the language, I have been doing some Duolingo for over 3 years, but I really started learning and understanding rules and such a couple months ago when I started online lessons.

    Thanks in advance!

    Edit: A couple people suggested Annie M.G. Schmidt so I looked at the first book in the Jip en Janneke books, but it seems that its too advanced for my level. I'll need to work my way up to that slowly. In the meantime, any suggestions for books aimed more towards 2-3 year olds? I feel like that would be more my current vocabulary level, and I can work my way up from there. Thanks

     

    Hello everyone, I've had an issue with discord on Arch Linux for a long time, but only now had the time to document the error (had to photograph it with phone and transcribe it).

    Its a weird one, buckle up.

    At random times, discord crashes which causes my polybar to crash, as well as my sxhkd, which obviously means my computer is practically useless until I hard shutdown using the power button on my case. Whats weird is that sometimes it will go weeks without crashing, and other times it will crash frequently in a short time span (e.g. it crashed a couple times yesterday, and once today).

    Here is the error as I photographed it:

    And here it is after I manually copied it into a text editor (keep in mind I might have missed a character here or there because of this).

    A JavaScript Error occurred in the main process
    
    Uncaught exception:
    Error: EROFS: read-only file system, write
    	at writeSync (node:fs:923:3)
    	at SyncWriteStream._write (node:internal/fs/sync._write_stream:275)
    	at writeOrBuffer (node:internal/streams/writable:572:12)
    	at _write (node:internal/streams/writable:501:10)
    	at Writeable.write (node:internal/streams/writable:510:10)
    	at console.value (node:internal/console/constructor:298:16)
    	at console.warn (node:internal/console/constructor:405:26)
    	at transport.writeFn (/opt/discord/resources/app.asar/node_modules/electron-log/src/node/transports/console.js:45:7)
    	at transport (/opt/discord/resources/app.asar/node_modules/electron-log/src/node/transports/console.js:51:15)
    	at Logger.processMessage (/opt/discord/resources/app.asar/node_modules/electron-log/src/core/Logger.js:175:11)
    

    Anyone have any idea how I can troubleshoot this?

    I also tried checking the following directory but it doesn't exist on my PC:

    /opt/discord/resources/app.asar/node_modules/electron-log/src/core/

    I only have the file /opt/discord/resources/app.asar So obviously something is going on there that shouldn't be happening.

    I've got no idea how to troubleshoot node apps, so would appreciate any help from those of you who have those skills.

    Thanks in advance! Please let me know if you need more info or need me to run commands and show you the output, and Ill do so.

     

    Hello everyone!

    I would like certain windows to remain in full screen even if another tiled/floating window is opened on the same workspace. I would also like the tiled/floating windows to remain above the full screen window so that they don't disappear if I click on the full screen window.

    The primary use case for this is games such as Eve Online, where I use a number of external tools which may or may not spawn new windows over the game window (e.g. the Rift Intel tool, which spawns a new small floating window whenever someone writes in one of the intel channels you set Rift to monitor). I dont want it to exit full screen mode. If a tiled or floating window is opened on the same window then Eve also goes into tiled mode.

    Reading up a little about this I came across the concept of layers in bspwm, but I'm not entirely sure if they fit for this use case. Here's an example of what I don't want to happen:

    (The Hostile Reported popup window is from Rift and spawns wherever focus is)

    Normally I have it be entirely fullscreen. I'd like to be able to interact with these and other popup windows in tiled/floating mode without pulling Eve out of fullscreen.

    How can I begin to work on this? Of course if you would like more info please ask and I'll provide it.

    Thanks in advance!

    [SOLUTION (I think)] I had to add this rule for my Eve client:

    bspc rule -a "steam_app_8500" state=fullscreen layer=below border=off focus=on
    

    but also had to add this rule for the Rift Intel tool:

    bspc rule -a "dev-nohus-rift-MainKt" state=floating layer=above
    

    I guess this is the way to do it for any set of programs where you want one to keep its fullscreen status but have others above it

    NOTE: This also applied the same behaviour to the eve launcher since the way steam proton works both the launcher and the clients have the same WM_CLASS. If anyone knows any way to distinguish them in bspwm please let me know. Here is what I get for each when running xprop:

    $ xprop | grep -E 'CLASS|NAME'
    _NET_WM_NAME(UTF8_STRING) = "EVE Launcher" WM_ICON_NAME(STRING) = "EVE Launcher" WM_NAME(STRING) = "EVE Launcher" WM_LOCALE_NAME(STRING) = "en_US.UTF-8" WM_CLASS(STRING) = "steam_app_8500", "steam_app_8500"
    # Click on launcher
    
    $ xprop | grep -E 'CLASS|NAME'
    _NET_WM_NAME(UTF8_STRING) = "EVE" WM_ICON_NAME(STRING) = "EVE" WM_NAME(STRING) = "EVE" WM_LOCALE_NAME(STRING) = "en_US.UTF-8" WM_CLASS(STRING) = "steam_app_8500", "steam_app_8500"
    # Click on client
    

    Ive tried rewriting the rule as such:

    bspc rule -a "steam_app_8500:steam_app_8500:EVE" state=fullscreen layer=below
    

    and also adding a rule for the launcher specifically (before the client rule):

    bspc rule -a "steam_app_8500:steam_app_8500:EVE Launcher" state=tiled layer=normal
    

    But the launcher still opens in fullscreen. The client however seems to be fine - it opens in fullscreen on the 'below' layer so when a new window is opened on the same workspace it isn't forced into tiled mode.

     

    Hello everyone :)

    I have this in a script which I call from my .zshrc:

    #!/bin/zsh
    
    # ~/.bin/check_last_update.sh
    
    GREEN='\033[92m'
    YELLOW='\033[93m'
    RED='\033[91m'
    RESET='\033[0m'
    
    # Check if there are available updates for packages
    num_packages_to_update=$(checkupdates | wc -l)
    
    if (( num_packages_to_update >= 0 && num_packages_to_update <= 20 )); then
    	echo -e "${GREEN}Available updates: $num_packages_to_update${RESET}" >> /dev/tty
    elif (( num_packages_to_update > 20 && num_packages_to_update <= 50 )); then
    	echo -e "${YELLOW}Available updates: $num_packages_to_update${RESET}" >> /dev/tty
    else
    	echo -e "${RED}Available updates: $num_packages_to_update${RESET}" >> /dev/tty
    fi
    
    # Kernel version check
    running_kernel=$(uname -r)
    installed_kernel=$(pacman -Q linux | awk '{print $2}' | cut -d '-' -f1 | cut -d '.' -f1,2,3)
    
    running_kernel_base=$(echo "$running_kernel" | cut -d '-' -f1)
    
    if [[ "$running_kernel_base" != "$installed_kernel" ]];
    then
    	echo -e "${RED}Kernel mismatch detected. Reboot recommended.${RESET}" >> /dev/tty
    fi
    

    It works, but when I open a new terminal it may take up to 2 seconds for the prompt to show up. Is there a way of speeding this up?

    Would it be a good idea to perform the checks in the background every hour or so, maybe with a systemd timer or something, and cache the results (or possibly to make it even more efficient, just store a file somewhere out of the way containing the number of updates and if there is a kernel mismatch - maybe on separate lines so when I open a terminal I can easily query the file and get exactly what I need) so that when I open a new terminal instead of checking with the live repositories it checks the cached data? Also, I guess this would mean that if a package has become available for update after the last time the check script runs, then the number it tells me will be less than the actual number of available updates, right?

    Thanks in advance!

     

    Hello guys.

    I'm trying to learn some more KiCAD and general electronics design from scratch by continuing my thesis project after I've submitted it and its all done, but by taking it to the next step and actually getting a PCB and soldering everything on. This is to get experience through the entire process from design to assembly.

    Where I'm stuck is at creating the footprints for my components. I've watched a bunch of videos about the topic, but they all seem to be for boards with no header pins attached to them, or for pins that are vertical (perpendicular to the actual board). The two boards I have are breakout boards for a DS3231 RTC and an HM-10 BLE module, and they both have right-angle male header pins sticking out, which obviously made prototyping on a breadboard really easy, but I'm struggling with converting them to PCB.

    Here are some photos to make it clearer:

    HM-10:

    DS3231:

    I know one of my options is to desolder the right-angle header pins and add straight pins to them, but I'd like to avoid that so that I can easily use them in any future projects by simply disconnecting them from the eventual PCB and using them in a breadboard.

    As such, I know that I would like there to be female headers on the final PCB, and ideally the female headers will also be at a right-angle so that the final PCB is a little more compact and there aren't just some boards sticking out from it.

    So, after getting some measurements with my calipers, how can I translate them into the KiCAD footprint editor knowing the footprint should include the female right-angle header pins (which will of course extend the length of the modules beyond what I have currently measured), and also take their height into account so that they don't have any obstacles between them and the PCB as they are laying parallel to it?

    I hope I made myself clear enough, but if not please feel free to ask me for any clarification.

    Thanks in advance for any replies :)

     

    Hello guys, my question is basically in the title. I would really like to be able to have the parameter names included when I cursor over a function and open the 'hover' window to show basic info about it. Currently it only shows me the expected types, which while still useful I feel is only a piece of the puzzle when working either with a new library, or a codebase you're not familiar with.

    As an example I'm learning ncurses these past couple days, and its significantly flow-breaking to have to switch focus away from the editor to either search on the web what a particular function takes as parameters, or open a separate terminal to read the man page for it. I'm still not familiar with the library so I frequently need to look up what a parameter represents in the context of the code, in addition to what type I should give it. Is there any way to do this while still using clangd as my lsp server?

    Ive also included a screenshot of one such hover window for the ncurses function mvprintw.

     

    Hello guys, Ive built a super simple web app to convert google maps urls to the osm format, mainly for my personal use but also for anyone who has this use case as well.

    Most link formats work, but there are a couple that have been giving me particular trouble. Here are the formats that work as expected:

    https://www.google.com/maps/place/Eiffel+Tower/@48.8584,2.2945,17z
    https://google.com/maps/place/Statue+of+Liberty/@40.6892,-74.0445,17z
    https://maps.app.goo.gl/SoDFgcPJKVPeZXqd8
    https://www.google.co.uk/maps/place/Buckingham+Palace/@51.5014,-0.1419,17z
    https://www.google.de/maps/place/Brandenburger+Tor/@52.5163,13.3777,17z
    

    These 2 formats dont work on the server, but if I run the app locally they work and give a correct osm formatted link:

    https://maps.app.goo.gl/jXqDkM2NWN55kZcd9?g_st=com.google.maps.preview.copy
    https://maps.google.com/maps?q=Big+Ben%2C+London
    

    You can test it on the actual website (gmaps2osm.de), but essentially if you try to convert links of this format on the actual website you get an Internal Server Error after around 10 seconds of it thinking.

    Right now Im focusing on the .preview.copy formatted links. As you will see from the code below, I am using playwright to headlessly handle googles annoying redirects and consent forms:

    from typing import final
    from flask import Flask, request, render_template, jsonify
    from datetime import datetime
    import re
    import urllib.parse
    import requests
    from playwright.sync_api import sync_playwright
    
    # Test urls for regex:
    # https://www.google.com/maps/place/Eiffel+Tower/@48.8584,2.2945,17z
    # https://google.com/maps/place/Statue+of+Liberty/@40.6892,-74.0445,17z
    # https://maps.google.com/maps?q=Big+Ben%2C+London # has an issue, doesnt work
    # https://maps.app.goo.gl/4jnZLELvmpvBmFvx8
    # https://maps.app.goo.gl/jXqDkM2NWN55kZcd9?g_st=com.google.maps.preview.copy
    # https://www.google.co.uk/maps/place/Buckingham+Palace/@51.5014,-0.1419,17z
    # https://www.google.de/maps/place/Brandenburger+Tor/@52.5163,13.3777,17z
    
    debug_enabled = False
    is_headless = not debug_enabled
    print(f"is_headless: {is_headless}")
    log_file_path = ""
    app = Flask(__name__)
    
    GMAPS_URL_RE = re.compile(
    	r"""(?x)  # Verbose mode
    	^https?://
    	(
    		(www\.)?
    		(google\.[a-z.]+/maps)			  |		# www.google.com/maps, google.co.uk/maps, etc.
    		(maps\.google\.[a-z.]+)			  |		# maps.google.com
    		(goo\.gl/maps)					  |		# goo.gl/maps
    		(maps\.app\.goo\.gl)					# maps.app.goo.gl
    		# (maps\.app\.goo\.gl.*\.preview\.copy)	# maps.app.goo.gl(...).preview.copy
    	)
    	""",
    	re.IGNORECASE
    )
    
    # ---- Dispatcher
    def extract_coordinates(url: str):
    	if ".preview.copy" in url:
    		return handle_preview_copy_url(url)
    	if "maps?q=" in url:
    		return handle_browser_resolved_url(url)
    	else:
    		return handle_standard_url(url)
    
    # ---- Handler: preview.copy links
    def handle_preview_copy_url(url: str):
    	url = url.split('?')[0]
    	input_url = resolve_initial_redirect(url)
    	if "consent.google.com" in input_url:
    		parsed = urllib.parse.urlparse(input_url)
    		query = urllib.parse.parse_qs(parsed.query)
    		continue_url = query.get("continue", [""])[0]
    		if continue_url:
    			input_url = urllib.parse.unquote(continue_url)
    		else:
    			log_msg("ERROR", "No 'continue' parameter found.")
    			return None, input_url
    	final_url = extract_with_playwright(input_url)
    	coord = extract_coords_from_url(final_url)
    	return coord, final_url
    
    # ---- Handler: links with only a query containing place names (https://maps.google.com/maps?q=Big+Ben%2C+London)
    def handle_browser_resolved_url(url: str):
    	input_url = resolve_initial_redirect(url)
    	if "consent.google.com" in input_url:
    		parsed = urllib.parse.urlparse(input_url)
    		query = urllib.parse.parse_qs(parsed.query)
    		continue_url = query.get("continue", [""])[0]
    		if continue_url:
    			input_url = urllib.parse.unquote(continue_url)
    		else:
    			log_msg("ERROR", "No 'continue' parameter found.")
    			return None, input_url
    	final_url = extract_with_playwright(input_url)
    	coord = extract_coords_from_url(final_url)
    	return coord, final_url
    
    # ---- Handler: standard links
    def handle_standard_url(url: str):
    	try:
    		# Follow redirect to get final destination
    		response = requests.head(url, allow_redirects=True, timeout=10)
    		final_url = response.url
    		log_msg("DEBUG", "Final URL:", final_url)
    	except requests.RequestException as e:
    		raise RuntimeError(f"Failed to resolve standard URL: {e}")
    	coords = extract_coords_from_url(final_url)
    	return coords, final_url
    
    # ---- Utility: redirect resolver
    def resolve_initial_redirect(url: str):
    	try:
    		response = requests.get(url, allow_redirects=True, timeout=10)
    		return response.url
    	except Exception as e:
    		log_msg("ERROR", "Redirect failed: ", e)
    		return url
    
    # ---- Utility: use playwright to get the final rendered URL
    def extract_with_playwright(url:str):
    	with sync_playwright() as p:
    		browser = p.chromium.launch(headless=is_headless)
    		page = browser.new_page()
    		page.goto(url)
    		# Click reject button if necessary
    		try:
    			page.locator('button:has-text("Reject all")').first.click(timeout=5000)
    		except:
    			pass # No reject button
    		page.wait_for_function(
    				"""() => window.location.href.includes('/@')""",
    				timeout=15000
    		)
    		final_url = page.url
    		log_msg("DEBUG", "Final URL: ", final_url)
    		browser.close()
    		return final_url
    
    # ---- Utility: extract coordinates with regex patterns
    def extract_coords_from_url(url: str):
    	patterns = [
    		r'/@([-.\d]+),([-.\d]+)',				 # Matches /@lat,lon
    		r'/place/([-.\d]+),([-.\d]+)',			 # Matches /place/lat,lon
    		r'/search/([-.\d]+),\+?([-.\d]+)',
    		r'[?&]q=([-.\d]+),([-.\d]+)',			 # Matches ?q=lat,lon
    		r'[?&]ll=([-.\d]+),([-.\d]+)',			 # Matches ?ll=lat,lon
    		r'[?&]center=([-.\d]+),([-.\d]+)',		 # Matches ?center=lat,lon
    		r'!3d([-.\d]+)!4d([-.\d]+)'				 # Matches !3dlat!4dlon
    	]
    	for pattern in patterns:
    		match = re.search(pattern, url)
    		if match:
    			return match.groups()
    	return None
    
    # ---- Utility: logging function to output and write to file
    def log_msg(level: str, msg: str, optional_arg = None):
    	ts = datetime.now()
    	iso_ts = ts.isoformat()
    	if level == "DEBUG" and debug_enabled == False:
    		return
    	if optional_arg:
    		log_line = f"[{iso_ts}]:[{level}]: {msg} {optional_arg}"
    	else:
    		log_line = f"[{iso_ts}]:[{level}]: {msg}"
    	print(log_line)
    	with open(log_file_path+"gmaps2osm_logs.txt", "a") as log_file:
    		log_file.write(log_line+"\n")
    
    @app.route("/", methods=["GET", "POST"])
    def index():
    	result = {}
    	if request.method == "POST":
    		url = request.form.get("gmaps_url", "").strip()
    		log_msg("DEBUG", "URL:", url)
    		if not url:
    			result["error"] = "Please enter a Google Maps URL."
    			log_msg("DEBUG", "Not a URL")
    		else:
    			try:
    				if not GMAPS_URL_RE.search(url):
    					result["error"] = "Please enter a valid Google Maps URL."
    				else:
    					coords, final_url = extract_coordinates(url)
    					log_msg("DEBUG", "coords:", coords)
    					if coords:
    						lat, lon = coords
    						result["latitude"] = lat
    						result["longitude"] = lon
    						result["osm_link"] = f"https://osmand.net/map?pin=%7Blat%7D%2C%7Blon%7D#16/{lat}/{lon}"
    					else:
    						raise ValueError("No coordinates found in the URL.")
    			except ValueError as e:
    				result["error"] = f"Error resolving or parsing URL: {e}"
    	return render_template("index.html", **result)
    
    if __name__ == "__main__":
    	app.run(debug=True)
    

    You can view all the code at the github: https://github.com/promitheas17j/gmaps2osm

    But essentially its running as a docker container (my first project using docker woowoo) and this is the output of the logs on the server when I enter such a link:

    $ docker logs -f gmaps2osm
    [2025-08-15 17:42:00,132] ERROR in app: Exception on / [POST]
    Traceback (most recent call last):
      File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1511, in wsgi_app
        response = self.full_dispatch_request()
      File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 919, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 917, in full_dispatch_request
        rv = self.dispatch_request()
      File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 902, in dispatch_request
        return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
      File "/app/app.py", line 164, in index
        coords, final_url = extract_coordinates(url)
      File "/app/app.py", line 42, in extract_coordinates
        return handle_preview_copy_url(url)
      File "/app/app.py", line 61, in handle_preview_copy_url
        final_url = extract_with_playwright(input_url)
      File "/app/app.py", line 113, in extract_with_playwright
        page.wait_for_url("**/@**", timeout=15000)
      File "/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py", line 9162, in wait_for_url
        self._sync(
      File "/usr/local/lib/python3.10/dist-packages/playwright/_impl/_sync_base.py", line 115, in _sync
        return task.result()
      File "/usr/local/lib/python3.10/dist-packages/playwright/_impl/_page.py", line 584, in wait_for_url
        return await self._main_frame.wait_for_url(**locals_to_params(locals()))
      File "/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py", line 263, in wait_for_url
        async with self.expect_navigation(
      File "/usr/local/lib/python3.10/dist-packages/playwright/_impl/_event_context_manager.py", line 33, in __aexit__
        await self._future
      File "/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py", line 239, in continuation
        event = await waiter.result()
    playwright._impl._errors.TimeoutError: Timeout 15000ms exceeded.
    =========================== logs ===========================
    waiting for navigation to "**/@**" until 'load'
    ============================================================
    

    This was when I gave this URL as input: https://maps.app.goo.gl/jXqDkM2NWN55kZcd9?g_st=com.google.maps.preview.copy

    Anyone have any idea why playwright is throwing errors at me?

    Thanks in advance, I really appreciate any help you can give me. Ive been banging my head about this issue on and off the past couple of months.

     

    Hello everyone!

    As the title says, I am trying to set up email alerts on my server whenever there is a successful ssh connection (will also setup the same for failed connections with fail2ban later). I already have the email script created and it works (I use it to monitor the directories containing all of these security scripts for changes so that I also get notified if anything critical is modified or deleted in those directories).

    I also created a very basic user called test for - you guessed it - testing purposes. This user doesn't have a home directory or anything like that.

    Here are the relevant scripts:

    $ cat /usr/local/bin/login-alert.sh
    #!/bin/bash
    
    # Sends alerts only for real terminals not cron jobs
    if [[ -n "$SSH_CONNECTION" ]]; then
    	USERNAME=$(whoami)
    	IP=$(echo $SSH_CONNECTION | awk '{print $1}')
    	HOST=$(hostname)
    	DATETIME=$(date)
    	/usr/local/bin/semail \
    		-s "[CRITICAL] SSH Login to $HOST" \
    	 	-b "Login detected:\n\nUser: $USERNAME\nIP: $IP\nTime: $DATETIME\nTTY: $SSH_TTY"
    fi
    
    $ cat /usr/local/bin/semail
    #!/bin/bash
    
    # Default values
    TO="my_email@here.com"
    FROM="notifications@my_server.com"
    SUBJECT=""
    BODY=""
    BODY_FILE=""
    
    
    # Help function
    show_help() {
    cat <<EOF
    Usage: $0 [OPTIONS]
    
    Send a test email using Postfix.
    
    Options:
      -t, --to EMAIL            Recipient email address (default: $TO)
      -s, --subject TEXT        Subject of the email (required)
      -b, --body TEXT           Body text of the email
      -f, --body-file FILE      File to read body text from (overrides --body)
      -h, --help                Show this help message
    
    If no body or body-file is provided, you will be prompted to enter the body interactively.
    
    Examples:
      $0 -s "Test subject" -b "Hello\nThis is a test"
      $0 --subject "Test" --body-file message.txt
    EOF
    }
    
    # Parse arguments
    while [[ "$#" -gt 0 ]]; do
    	case "$1" in
    		-t|--to)
    			TO="$2"
    			shift 2
    			;;
    		-s|--subject)
    			SUBJECT="$2"
    			shift 2
    			;;
    		-b|--body)
    			BODY="$2"
    			shift 2
    			;;
    		-f|--body-file)
    			BODY_FILE="$2"
    			shift 2
    			;;
    		-h|--help)
    			show_help
    			exit 0
    			;;
    		*)
    			echo "Unknown option: $1"
    			show_help
    			exit 1
    			;;
    	esac
    done
    
    # Validate required parameters
    if [[ -z "$SUBJECT" ]]; then
    	echo "Error: --subject is required."
    	show_help
    	exit 1
    fi
    
    # Handle body input
    if [[ -n "$BODY_FILE" ]]; then
    	if [[ ! -f "$BODY_FILE" ]]; then
    		echo "Error: Body file '$BODY_FILE' does not exist."
    		exit 1
    	fi
    	BODY=$(<"$BODY_FILE")
    elif [[ -z "$BODY" ]]; then
    	echo "Enter the body of the email (end with Ctrl-D):"
    	BODY=$(</dev/stdin)
    fi
    
    # Send email
    {
    	echo "From: $FROM"
    	echo "To: $TO"
    	echo "Subject: $SUBJECT"
    	echo "Content-Type: text/plain; charset=UTF-8"
    	echo
    	printf "%b\n" "$BODY"
    } | /usr/sbin/sendmail -t -f "$FROM"
    
    # /usr/sbin/sendmail -f "$FROM" "$TO" <<EOF
    # From: $FROM
    # To: $TO
    # Subject: $SUBJECT
    
    # $BODY
    # EOF
    
    echo "Email sent to $TO"
    

    And here is the output I see when I login as the test user:

    ssh test@my_server.com
    test@my_server.com's password:
    dir=/ failed: exit code 2
    dir=/ failed: exit code 2
    Linux my_server 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64
    
    The programs included with the Debian GNU/Linux system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
    
    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
    permitted by applicable law.
    Last login: Fri Aug 15 07:08:24 2025 from my_ip_address
    Could not chdir to home directory /home/test: No such file or directory
    

    I don't get email alerts for any user, neither the test user nor my regular admin user.

    Here is my /etc/pam.d/sshd relevant lines:

    # Standard Un*x session setup and teardown.
    account optional pam_exec.so seteuid dir=/ /usr/local/bin/login_notify.sh
    @include common-session
    

    I also tried with session instead of account and without the dir=/ part.

    Can anyone help me troubleshoot this please?

    Thanks in advance. Of course if you need any more info I'll do my best to provide it :)

     

    Hello guys! Im using the official minecraft launcher, and decided to give Beta 1.7.3 a try for that nostalgic feeling of playing it for the first time on my grandmother's ancient PC. However, even when full screen I get what you can see in the image above, and I cant find any settings to change the resolution.

    Keep in mind, Im on a weird setup. Im on Arch Linux with bspwm and 2 monitors.

    If I press F11 while fullscreen it cycles through several modes and eventually gets to one where the game looks right as it should, but unfortunately that disables my second monitor and I need to restart bspwm to get everything as it should be (otherwise it just duplicates the first monitor to the second one).

    I read in some forum threads that where might be some java launch arguments that can set the resolution, but Im not sure how to do any of that from the MC launcher.

    Any help is appreciated!

     

    Hello everyone (whoever is subbed to this community)! Ive been wanting to get into inline skating for a while now, but just dont have the knowledge of where to start.

    Im in Europe, specifically Cyprus (so first-hand buying options are limited) so if I would bite the bullet and order skates online to learn it would be without trying them on first. I do plan on moving to the Netherlands where I know theres an awesome skating shop in Amsterdam, but that could be at any time this month or year (depends on when I find a job).

    Up to now I bought some ultra cheap skates on black friday a couple years ago (No Fears I believe they were), which after the second day of practicing in the park had the frame get loose (and it wasnt designed to be able to tighten or fix). That was super disappointing because I was really excited to get into this hobby.

    Anyways, what are your thoughts? Should I see what options I have for getting into it while I am still here, or wait until I get to a more "civilised" part of the world where there are actually opportunities to do stuff? xD

    Also, if you recommend I get into it right away, how should I pick as good a skate as possible without actually trying it on first?

    Thanks in advance!

    view more: ‹ prev next ›