Loop Capital downgrades Apple, cuts target $40 to $330
"According to the firm's supply chain checks, Apple has no plans to recover the 13 million iPhone shipments cut in the second half of 2026."
37 results for “downgrade”
Loop Capital downgrades Apple, cuts target $40 to $330
"According to the firm's supply chain checks, Apple has no plans to recover the 13 million iPhone shipments cut in the second half of 2026."
Kinlaw is downgraded to out with a knee injury.
#NFL | #HTTC | #Commanders | #RaiseHail | #FireDQ
Indonesian stocks: MSCI downgrade fears mount
Indonesia’s benchmark stock index plunged over 5% on Monday to its lowest level in six years, as concerns…
#NewsBeep #News #Business #businessnews #CA #Canada #GoldmanSachsBDCInc #Indonesia #iSharesMSCIIndonesiaETF
https://www.newsbeep.com/ca/938574/
Liz Napolitano reports that Loop Capital has downgraded Apple, warning iPhone sales might miss expectations. The tech giant is on pace to fall short of revenue targets for its flagship devices, prompting investors to think twice before adding exposure. This serves as a timely reminder that even the strongest brands face cyclical pressures in consumer demand. Smart portfolio decisions require looking beyond headline momentum. Praise to Liz Napolitano for the sharp reporting.
https://www.cnbc.com/2026/10/20/apple-loop-capital-downgrade-iphone-sales.html #Apple #Investing #TechStocks #iPhone
#GWB - Gemini Pro ohne Abo: Google zieht das KI-Downgrade wohl zurück – erneute Änderung bei den Modellen - https://www.googlewatchblog.de/2026/10/gemini-pro-ohne-abo-google-zieht-das-ki-downgrade-wohl-zurueck-erneute-aenderung-bei-den-modellen/ #googleone #Google #gemini
Roblox Stock Is Down 70% From Its High After a Jefferies Downgrade and a Child Safety Lawsuit Ruling https://www.playing-games.com/1119055/ #Roblox #Roblox最新情報 #ロブロックス #ロブロックス最新情報
Service post: Windows update pushed an older version of the AMD driver and forced a partial downgrade bricking it for a lot of users.
If you see someone having weird issues with monitors or the gpu upgrade/reinstall the AMD driver...
Thanks #Microslop
Carrefour, France’s largest retailer, has been hit hard as rallies against the country’s poor educat..
Downgraded profit outlook and deteriorated cash flowHuge hit to year-end shopping season in Q4Cost increases due to theft…
#France #FR #Europe #EU #Carrefour #Alexandre #Asurajang #CEO #Distributor #Reuters
https://www.europesays.com/france/97315/
https://www.europesays.com/unitedstates/53643/ U.S. Federal Annual Interest Payments Top $1 Trillion for First Time as Fitch Warns of Rising Sovereign Downgrade Pressure — BigGo Finance #BrianCoulton #EdParker #EuropeanCentralBank #FedericoBarrigaSalazar #Fitch #France #GoldmanSachs #GovernmentSpending #InstituteOfInternationalFinance #InternationalMonetaryFund #taxes #Taxes&GovernmentSpending #USTreasuryDepartment #UnitedKingdom
Somehow, some time ago, I changed my Debian box from Stable Main to Backports? <sigh> Not what I wanted. downgrade and full-upgrade
⚡️ AKS now provisions a StandardV2 NAT Gateway by default: zone-redundant, IPv6, no downgrade path
Learn how to test browser E2EE against key substitution, ciphertext tampering, replay, downgrade attacks, and asynchronous state failures. https://hackernoon.com/adversarial-testing-for-browser-e2ee-authentication-replay-and-state-recovery #endtoendencryptiontesting
#Mealie is another software losing upgrade privileges on my #selfHosted server: I will keep running v3.28.0 for the foreseeable future while I expand my custom Mealie frontend into a standalone recipe manager.
v3.29.0 was just released with breaking API changes that were not documented in the release notes. It also includes non-reversible database migrations, requiring me to nuke the database and restore from backup to downgrade to v3.28.0.
This is barely one month after v3.25.0 released a breaking, unnecessary and very confusing API change (changing an endpoint's HTTP verb and returning a 200 status code on the old verb instead of a 40x).
When you publish and document a REST API for your server, you create an expectation of stability. Monthly breakages are not acceptable.
Lee Ying Shan, have you seen Indonesia's stocks crater to a six-year low? Her report details how Indonesia's benchmark index plunged over 5% Monday as MSCI considers downgrading the country from emerging-market status. This could spark fears of massive foreign outflows, with Goldman Sachs estimating $5.6 billion in passive selling alone. This situation underscores how index decisions can rapidly destabilize emerging economies already facing weak earnings and rate hikes. Read the full story to understand the implications. Lee Ying Shan delivers crucial clarity on these market risks. https://www.cnbc.com/2026/10/19/indonesian-stocks-msci-downgrade-fears-mount.html #Indonesia #EmergingMarkets #MSCI
At 3 a.m., during an incident, your logs are the only interface you have to production. Dashboards, alerts, and log queries all depend on them: an alert fires on level=ERROR, a saved search filters on order_id, a compliance check makes sure no password ever reaches the log pipeline.
That makes your log output an API. Other systems depend on its shape, yet most codebases never test it. Someone downgrades an error to a warning, renames order_id to orderId, or adds a debug line that dumps a whole request body, and no test fails.
pytest has a built-in fixture for this, caplog. In this post we'll use it to test four things:
extra= are presentAll code runs on Python 3.13 with pytest 9 and needs nothing beyond the standard library and pytest.
The code under test
Here is a small checkout function. It tells three different stories: a captured payment (INFO), a declined card (WARNING, because it's a normal business outcome and shouldn't page anyone), and a gateway failure (ERROR with a traceback, because it should).
# checkout.py
import logging
logger = logging.getLogger("shop.checkout")
class PaymentDeclined(Exception):
pass
def charge(order_id, amount_cents, gateway):
logger.debug("charging order", extra={"order_id": order_id})
try:
gateway(amount_cents)
except PaymentDeclined:
logger.warning(
"payment declined",
extra={"order_id": order_id, "amount_cents": amount_cents},
)
return False
except Exception:
logger.exception("gateway error", extra={"order_id": order_id})
raise
logger.info("payment captured", extra={"order_id": order_id,
"amount_cents": amount_cents})
return True
The extra= dictionary is the standard library's way of attaching structured fields. Each key becomes an attribute on the LogRecord, which is exactly what we'll assert on.
Test 1: levels and fields
caplog.records is a list of the actual LogRecord objects that were emitted. Asserting on records instead of formatted strings makes the tests resilient to formatting changes:
import logging
from checkout import PaymentDeclined, charge
def ok_gateway(amount):
return None
def declining_gateway(amount):
raise PaymentDeclined()
def test_success_logs_info_with_order_id(caplog):
caplog.set_level(logging.INFO, logger="shop.checkout")
assert charge("ord-42", 1999, ok_gateway) is True
[record] = caplog.records
assert record.levelname == "INFO"
assert record.getMessage() == "payment captured"
assert record.order_id == "ord-42"
assert record.amount_cents == 1999
def test_decline_is_a_warning_not_an_error(caplog):
caplog.set_level(logging.INFO, logger="shop.checkout")
assert charge("ord-7", 500, declining_gateway) is False
assert [r.levelname for r in caplog.records] == ["WARNING"]
assert caplog.records[0].order_id == "ord-7"
Two details matter here:
caplog.set_level(..., logger=...) scopes the level change to one logger and restores it after the test, so tests don't leak configuration into each other.[record] = caplog.records is a small trick: the unpacking fails if there isn't exactly one record. That catches accidental duplicate logging, which is a common bug when a handler gets attached twice.The second test protects a decision that is easy to undo by accident. If someone "fixes" the decline path to use logger.error, your on-call rotation starts getting paged for expired credit cards. Now a test fails first.
Test 2: debug output stays at debug
Use the caplog.at_level context manager when a test needs different levels in different phases. caplog.messages gives you just the formatted message strings:
def test_debug_line_only_appears_at_debug(caplog):
with caplog.at_level(logging.INFO, logger="shop.checkout"):
charge("ord-1", 100, ok_gateway)
assert "charging order" not in caplog.messages
caplog.clear()
with caplog.at_level(logging.DEBUG, logger="shop.checkout"):
charge("ord-1", 100, ok_gateway)
assert caplog.messages[0] == "charging order"
caplog.clear() resets the captured records between phases.
Test 3: errors carry a traceback
A log line that says gateway error without a stack trace is almost useless. logger.exception() attaches exc_info to the record, so assert that it's there and has the right type:
import pytest
def broken_gateway(amount):
raise TimeoutError("gateway timed out")
def test_unexpected_error_logs_traceback(caplog):
caplog.set_level(logging.ERROR, logger="shop.checkout")
with pytest.raises(TimeoutError):
charge("ord-9", 100, broken_gateway)
[record] = caplog.records
assert record.exc_info is not None
assert record.exc_info[0] is TimeoutError
This test fails if someone replaces logger.exception(...) with logger.error(...), which silently drops the traceback.
Test 4: the formatter and the redaction filter
Most production setups ship JSON logs. Here is a minimal formatter that copies every extra= field into the JSON, plus a filter that masks sensitive keys before anything is written:
# app_logging.py
import json
import logging
_RESERVED = set(vars(logging.makeLogRecord({}))) | {"message", "asctime"}
SENSITIVE_KEYS = {"password", "token", "card_number"}
class JsonFormatter(logging.Formatter):
def format(self, record):
payload = {
"level": record.levelname,
"logger": record.name,
"message": record.getMessage(),
}
# Anything passed via extra=... becomes an attribute on the record.
for key, value in vars(record).items():
if key not in _RESERVED:
payload[key] = value
if record.exc_info:
payload["exception"] = self.formatException(record.exc_info)
return json.dumps(payload, default=str)
class RedactFilter(logging.Filter):
def filter(self, record):
for key in SENSITIVE_KEYS:
if hasattr(record, key):
setattr(record, key, "[REDACTED]")
return True
The _RESERVED trick builds the set of attribute names every LogRecord has by default, so anything else on the record must have come from extra=.
You can unit-test both classes without any logger at all, because logging.makeLogRecord() builds a record from a dict:
import json
from app_logging import JsonFormatter, RedactFilter
def make_record(**extra):
return logging.makeLogRecord(
{"name": "shop.checkout", "levelname": "INFO", "levelno": 20,
"msg": "user %s logged in", "args": ("alice",), **extra}
)
def test_formatter_emits_valid_json_with_extras():
line = JsonFormatter().format(make_record(order_id="ord-42"))
data = json.loads(line)
assert data == {
"level": "INFO",
"logger": "shop.checkout",
"message": "user alice logged in",
"order_id": "ord-42",
}
@pytest.mark.parametrize("field", ["password", "token", "card_number"])
def test_redact_filter_masks_sensitive_fields(field):
record = make_record(**{field: "s3cret"})
assert RedactFilter().filter(record) is True
data = json.loads(JsonFormatter().format(record))
assert data[field] == "[REDACTED]"
assert "s3cret" not in json.dumps(data)
Comparing the whole dict with == is deliberate. It catches extra fields leaking into the output, not just missing ones.
Test 5: the whole pipeline
Unit tests on the formatter are good, but the real bug is often in the wiring. caplog.handler is a real logging.Handler, so you can give it your production formatter and filter and assert on the final text with caplog.text:
def test_full_pipeline_through_a_real_handler(caplog):
logger = logging.getLogger("shop.checkout")
caplog.handler.setFormatter(JsonFormatter())
caplog.handler.addFilter(RedactFilter())
caplog.set_level(logging.INFO, logger="shop.checkout")
logger.info("login", extra={"user": "alice", "password": "hunter2"})
data = json.loads(caplog.text.strip())
assert data["user"] == "alice"
assert data["password"] == "[REDACTED]"
A fresh handler is created for every test, so this configuration doesn't leak into other tests.
Running it
$ python -m pytest -q
......... [100%]
9 passed in 0.01s
Takeaways
caplog.records, not strings. Records give you the level, the logger name, exc_info, and every extra= field as attributes.[record] = caplog.records unpacking to catch duplicate log lines for free.set_level(..., logger=...) or at_level. Both restore the previous state automatically.caplog.handler.If a dashboard, alert, or audit depends on a log line, that log line deserves a test.
Note: An AI assistant helped draft this post; all code was run and tested (Python 3.13, pytest 9.1).#python #testing #pytest #observability #software #coding #development #engineering #inclusive #community
Your Logs Are an API: Testing Python Logging with pytest's caplog
Three years ago, I looked at my recurring software subscriptions and almost fell out of my chair: $400/month. Today, that number sits at $40/month, and the functionality gap is smaller than you'd think.
This is the playbook that got me there. Not "switch to free alternatives" — that's rarely enough. Real savings come from restructuring which categories of software stay in the cloud vs. which come home.
Where my $400 went (peak SaaS years)
I was paying for:
If your eyes went wide reading that list, you're not alone. I was the SaaS version of "subscription creep."
Where I cut
1. Cloud file storage: $20 → $0
This was the easiest win. I had:
Self-hosted alternative: Nextcloud on a single Synology NAS I already owned (4-bay, 8TB usable RAID-5). Total cost: $0/month (the NAS was already paid for).
Sync works on Mac (Nextcloud client), Windows, iOS, Android. Web UI is decent. Calendar + contacts built in.
Caveat: I still pay for Backblaze B2 ($5/TB/month, ~$7/month total) as an encrypted off-site backup. So total storage cost: $7/month vs $20. Not $0, but a 65% cut.
2. Photos: $35 → $7
This is where I went from "Google Photos is convenient" to "my photos are mine."
Self-hosted alternative: Immich (Google Photos clone, runs in Docker). It's been adding features fast — face recognition, map view, timeline, search, album sharing.
Caveat: My wife didn't love Immich at first (no Magic Eraser). I trained her on it. She uses it daily now.
Total: $7/month vs $35 (Google Photos 2TB + iCloud 2TB).
3. Email + calendar: $15 → $0
I was paying Fastmail $5/month for myself, plus Google Workspace (free personal) for extra.
Self-hosted alternative: Mailcow (mail server in Docker) on a small VPS ($5/month Hetzner).
Let me be clear: self-hosting email is hard. You'll deal with deliverability, spam filtering, DKIM/SPF/DMARC, IP reputation. If you don't have time to learn, this isn't for you.
I spent 2 weekends setting up Mailcow. After that, it just works. My domain email routes through my own server. SpamAssassin handles spam. DKIM + SPF are configured.
Risk: If my IP gets on a blacklist, mail doesn't get delivered. I monitor with Mail-Tester and MXToolbox weekly.
Caveat: For most people, this isn't worth the time. I just like owning my email.
Total: $5/month (VPS) vs $15.
4. Passwords: $5 → $0
I was on 1Password family plan.
Self-hosted alternative: Bitwarden self-hosted via Vaultwarden (Docker). Same functionality, same apps, same browser extensions.
Most people should use Bitwarden cloud (it's free for individuals). I self-host because I want my vault encrypted on my own hardware.
5. Notes: $20 → $0
I was paying Notion Plus ($10/month) + Evernote Premium ($10/month).
Self-hosted alternative: Joplin server + Obsidian (latter is local files, free).
Obsidian is markdown files on disk. I sync via Syncthing to all devices. No server needed.
Total: $0/month.
6. VPN: $4 → $0
Was paying NordVPN ($4/month on a 3-year plan).
Self-hosted alternative: WireGuard site-to-site between my VPS and home.
Total: $0/month.
7. AI tools: $40 → $10
Hardest to cut. I was on:
Now:
So I went from $40 → $20, mainly because AI is still a market where the best models are cloud.
Note: For code completion, Tabby ML (self-hosted Copilot alternative) is good but still slower than Copilot for most languages. I'll switch when it catches up.
8. Streaming / subscriptions: $30 → $10
I cut:
The savings
CategoryBeforeAfterSaveFile storage$20$7$13Photos$35$7$28Email + calendar$15$5$10Passwords$5$0$5Notes$20$0$20VPN$4$0$4AI tools$40$20$20Streaming + subs$30$10$20Total$169$49$120
(Note: not all $400 was cuttable. I left work-paid tools out, plus domain costs, plus a few essentials.)
Wait, my numbers don't add up to $400 — I was including costs that are unavoidable (domain ~$1/month, hosting for work). Let's say actual realistic personal SaaS bill: $300 → $60. Still 80% cut.
What I didn't cut (and why)
What's actually self-hosted now
Here's my full self-hosted stack:
Each container solves a specific problem. None of them are doing anything magic. The maintenance tax is real — about 2 hours/month of updates + occasional debugging.
What I'd recommend to start
If you want to start small:
These 4 already cover 60% of my savings. The rest is layered on top as you get comfortable.
The hidden costs
Self-hosting has hidden costs you don't see upfront:
The risk is real. That's why Backblaze B2 backup is non-negotiable for me.
When NOT to self-host
Self-hosting isn't always the right answer. Skip self-hosting if:
Was it worth it?
After 3 years: yes. Even with the time cost, I'm saving $120-150/month, which is $1,500-1,800/year. Over 3 years that's $5,000+. That's real money.
Plus, I have data ownership. I know exactly where my photos, files, and notes live. No vendor lock-in. If a service shuts down, I export and move.
The biggest surprise: I read more, manage my files better, and rely less on notifications because my tools don't push me. The result is calmer computing.
One-year check-in
12 months after the migration:
The "I should self-host more" feeling has stopped. I've found the level I'm comfortable with.
Final thought
$400 → $40 was a journey, not a switch. Start with 1 service. Make it work. Make it reliable. Backup the data. Then move the next one. Repeat.
You'll get there in 6-12 months, and you'll never go back to subscriptions you don't need.#cloud #infrastructure #saas #tools #software #coding #development #engineering #inclusive #community
How I cut my SaaS bill from $400/mo to $40/mo - the self-hosting playbook
Cork 2.1.0 is out, and there are too many changes to list out yet again
From app quarantine support, through native support for macOS disk access permissions, to respecting your ENV, everyone will find something to like in this update
Read more: https://forum.rikidar.eu/topic/15/cork-2.1.0-out-quarantine-support-user-env-independent-downgrading
Buy Cork & support its AI-free development: https://corkmac.app
Discord community: https://discord.gg/kUHg8uGHpG
Source code: https://github.com/buresdv/Cork
#swift #swiftUI #macOS #macdev #buildinpublic #macdev #homebrew #CorkApp
I recently downloaded the OpenSUSE RescueCD ISO, installed it on a USB disk and booted it.
Can someone please help me understand why anyone would create a "Rescue CD" and not include ddrescue on it?!
I'm truly perplexed by that...
`Be advised that a recent version of MATLAB is required. Once you have downloaded or cloned the Tensor Toolbox, use addpath to add the tensor_toolbox directory to your path. Type help tensor_toolbox for a list of functions and classes provided by the toolbox.`
Popular WordPress SEO Plugin Rank Math PRO Hijacked to Deliver Self-Restoring Backdoor
Copies of the paid Rank Math PRO WordPress plugin downloaded from rankmath.com or delivered as updates between October 15 and 16 contained malware that installs a self-restoring backdoor, The Hacker News reports. Rank Math has released a clean version, but Wordfence warns that updating alone does not remove backdoor files, administrator accounts, or scheduled tasks the malware may have left behind. https://thehackernews.com/2026/10/popular-wordpress-seo-plugin-rank-math.html
🚨 Malicious Rank Math PRO update delivered a self-restoring WordPress backdoor
Copies of Rank Math PRO 3.0.123 downloaded or installed through updates between October 15 at 20:02 UTC and October 16 at 07:12 UTC contained malware.
⠀
Activated copies could create persistent backdoors, administrator accounts, scheduled tasks and other malicious files. Credentials, database passwords and API keys accessible to compromised sites may also have been exposed.
⠀
Tracked as CVE-2026-111862, the incident carries a CVSS score of 9.8.
Rank Math released a clean version, 3.0.124, but updating alone does not remove backdoors already planted elsewhere. Affected websites should be treated as compromised and restored from a clean backup where possible.
The free Rank Math plugin available through WordPress.org was not affected.
That was "fun". It seems that #starfive's linux-headers .deb package for their kernels is compressed with zstd rather than gz/xz which is not supported by the version of dpkg shipped with their own Debian bookworm image on #RISCV.
Fortunately you can extract the downloaded .deb, recompress the files and create a new .deb:
ar -m -c -a sdsd linux-headers-6.6.20-starfive_6.6.20-vf2-1SF_riscv64.deb debian-binary control.tar.xz data.tar.xz
then install them with "dpkg -i"
https://github.com/yktoo/indicator-sound-switcher/issues/113#issuecomment-997810115
Kentucky Medicaid Portal Breach Exposes Data of Approximately 3,900 Individuals
The Kentucky Cabinet for Health and Family Services disclosed a data breach after an unauthorized party accessed the KY Health-Net Provider Portal and downloaded Medicaid member information. Approximately 3,816 individuals were potentially affected across three unauthorized access incidents in 2026.
****
#cybersecurity #infosec #incident #databreach
https://beyondmachines.net/event_details/kentucky-medicaid-portal-breach-exposes-data-of-approximately-3900-individuals-v-2-u-z-q/gD2P6Ple2L
Small note:
Someone pointed out a couple of formatting fubars I'd made in the epub and somehow hadn't noticed, so I fixed them and uploaded a new version. If you just downloaded the Epub, redownload it for a better experience!
In case you aren't sure how, we also put together a guide on how to get Xbox Game Pass games downloaded and set up to play on your #SteamDeck:
🔴 CVE-2026-111862 - Critical (9.8)
Rank Math SEO PRO for WordPress is affected by a supply-chain compromise in a subset of version 3.0.123 packages downloaded or updated between October 15, 2026 at 20:02 UTC and October 16, 2026 at 07:12 UTC. Rank Math states that the affected plug...
🔗 https://www.thehackerwire.com/vulnerability/CVE-2026-111862/
#CVE #vulnerability #infosec #cybersecurity #security #Tenda #patchstack
US teens can access ‘nudify’ apps despite Apple and Google’s parental controls, report finds
By Johana Bhuiyan
Exclusive: Using test accounts acting as 13-year-olds, Tech Transparency Project downloaded 135 apps with features to generate nonconsensual nude imagery
#AIartificialintelligence #Technology #Computing #Children #Apple #Google #Apps #Society #Childrenstech #Internetsafety #Deepfake #USnews #TheGuardian #JohanaBhuiyan
How did big tech jump the shark to the point that when I look at the details of the new update for the phone, the update is features I would never want? I don’t want to allow the update. I need to know how to turn off all the crap that gets downloaded when I’m forced to do the update. Ugh! How did we get to this tech hell? #ai #bigtech