This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Monday, 08 December 2025
Οι περισσότερες αρχιτεκτονικές λογισμικού θεωρούν ότι το σύστημα είναι στατικό.
Σημείωση: Αυτό είναι το Μέρος 4 στη σειρά "Cooking with DiSE." Μέρος 1, Μέρος 2: Αποφοίτησε Μαθητευόμενα, και Μέρος 3: Αναξιόπιστοι Θεοί για το υπόβαθρο. Αυτό το άρθρο είναι η αρχιτεκτονική επισκόπηση - και τώρα έχουμε μια εργασία C# εφαρμογή: ως επί το πλείστον διαυγής. botdetection.
Βασική έννοια: Behavioural Routing. Αυτή η αρχιτεκτονική επιτρέπει μια νέα κατηγορία - όπου διαφανείς, ρυθμιζόμενες " ομάδες" των ανιχνευτών και των συστημάτων μάθησης αντανακλαστικά κίνηση που βασίζεται σε μαθημένα πρότυπα συμπεριφοράς, όχι στατικούς κανόνες. YARP GatewayΉ χρησιμοποιήστε το μεσαίο λογισμικό για να δημιουργήσετε συμπεριφορική δρομολόγηση απευθείας στο στρώμα εφαρμογών σας.
Για χρόνια, φτιάχνουμε λογισμικό όπως ρολόι: είσοδοι, έξοδοι, κανόνες, αγωγοί, δοκιμές, ανάπτυξη.
Αλλά τα σύγχρονα συστήματα - ειδικά τα ΑΑ-αυξανόμενα - δεν συμπεριφέρονται πλέον σαν ρολόγια.
Οι στατικές αρχιτεκτονικές δεν μπορούν να αντέξουν, βάζεις μια τρύπα, τρεις ακόμα εμφανίζονται, κουρδίζεις ένα κατώφλι, κάτι άλλο σπάει, πάντα αντιδράς, ποτέ δεν προσαρμόζεσαι.
Αρχιτεκτονική DiSE (Directed Synthetic Evolution) αντιμετωπίζει το λογισμικό με τον τρόπο που αντιμετωπίζουν οι βιολόγοι τους οργανισμούς: ως κάτι που πρέπει να προσαρμοστεί, να αυτοδιορθωθεί και να βελτιωθεί υπό πίεση.
Παραδοσιακή αρχιτεκτονική:
flowchart LR
B[Build] --> S[Ship] --> P[Patch] --> B
style B stroke:#6366f1,stroke-width:2px
style P stroke:#ef4444,stroke-width:2px
Αρχιτεκτονική DiSE:
flowchart LR
P[Perceive] --> E[Evaluate] --> M[Mutate] --> S[Select] --> P
style P stroke:#10b981,stroke-width:2px
style M stroke:#f59e0b,stroke-width:2px
style S stroke:#6366f1,stroke-width:2px
Ένα σύστημα DiSE έχει τέσσερις βασικές συμπεριφορές:
Η Συμπεριφορά Τι Κάνει Το Βιολογικό Ισοδύναμο |-----------|--------------|----------------------| | Κατάλαβες; Συγκεντρώστε σήματα από το περιβάλλον Αισθητήρια όργανα | Αξιολόγηση Σήματα σκορ ενάντια στους στόχους ~ Νευρικό σύστημα ~ | Mutate Φτιάξε παραλλαγές στρατηγικών Γενετική μετάλλαξη. | Επιλογή □ Κρατήστε ό, τι λειτουργεί, απορρίψτε ό, τι doesn apos?
Κυριολεκτικά έτσι εξελίσσεται το σύστημά σου με την πάροδο του χρόνου.
ως επί το πλείστον διαυγής. botdetection είναι η πρώτη εφαρμογή C# των αρχών DiSE. Ας εντοπίσουμε την αρχιτεκτονική:
Το σύστημα χρησιμοποιεί ένα Μαυροσανίδα ορχηστρωτής - οι ανιχνευτές συμβάλλουν σε μια κοινή κατάσταση, ενεργοποιώντας άλλους ανιχνευτές καθώς συσσωρεύονται τα σήματα:
// Detectors emit contributions (evidence), not verdicts
public sealed record DetectionContribution
{
public required string DetectorName { get; init; }
public required string Category { get; init; }
// Positive = bot signal, Negative = human signal
public required double ConfidenceDelta { get; init; }
public double Weight { get; init; } = 1.0;
public required string Reason { get; init; }
public BotType? BotType { get; init; }
// Signals for triggering other detectors
public ImmutableDictionary<string, object> Signals { get; init; }
}
Πολλαπλοί ανιχνευτές λειτουργούν σε παράλληλα κύματαΤο κάθε ένα συμβάλλει σε ένα αποδεικτικό στοιχείο. Το σύστημα αντιλαμβάνεται το περιβάλλον μέσω πολλών φακών:
// Wave 0: All detectors with no trigger conditions run in parallel
// Wave N: Detectors whose triggers are now satisfied run in parallel
while (waveNumber < MaxWaves && !cancellationToken.IsCancellationRequested)
{
var readyDetectors = availableDetectors
.Where(d => !ranDetectors.Contains(d.Name))
.Where(d => CanRun(d, state.Signals))
.ToList();
await ExecuteWaveAsync(readyDetectors, state, aggregator, ...);
// Check for early exit on high confidence
if (aggregator.ShouldEarlyExit)
break;
}
Αποδεικτικά μεγέθη σε μια απόφαση με τη χρήση sigmoid μετασχηματισμό - αυτό ωθεί σωστά ισχυρά σήματα από ανιχνευτές υψηλού βάρους:
private (double botProbability, double confidence) CalculateWeightedScore()
{
var weighted = _contributions
.Where(c => c.Weight > 0)
.Select(c => (delta: c.ConfidenceDelta, weight: c.Weight))
.ToList();
var weightedSum = weighted.Sum(w => w.delta * w.weight);
// Sigmoid maps any real number to (0, 1)
// Strong human signal (-3) → ~5% bot probability
// Neutral (0) → 50% bot probability
// Strong bot signal (+3) → ~95% bot probability
var botProbability = 1.0 / (1.0 + Math.Exp(-weightedSum));
return (botProbability, confidence);
}
Η αξιολόγηση δεν είναι ούτε ένα μοντέλο που παίρνει μια απόφαση. σταθμισμένη συναίνεση@ info: whatsthis σε πολλούς εξειδικευμένους ανιχνευτές - και σε κρίσιμο βαθμό, όταν η AI δεν έχει τρέξει, η πιθανότητα είναι Σφιγκτήρας για να αποφευχθεί η υπερβολική αυτοπεποίθηση:
// CRITICAL: Clamp probability when AI hasn't run
var botProbability = aiRan
? rawBotProbability
: Math.Clamp(rawBotProbability, 0.20, 0.80);
Το σύστημα δεν λειτουργεί πάντα όλους τους ανιχνευτές, όταν τα πρώτα στοιχεία είναι πειστικά, φεύγει γρήγορα.
// Early exit on verified bots (good or bad)
public static DetectionContribution VerifiedGoodBot(
string detector, string botName, string reason) => new()
{
DetectorName = detector,
Category = "Verification",
ConfidenceDelta = 0,
TriggerEarlyExit = true,
EarlyExitVerdict = EarlyExitVerdict.VerifiedGoodBot
};
Στην παραγωγή, Η υψηλή αυτοπεποίθηση ζητά έξοδο σε λιγότερο από 10ms Ο πλήρης αγωγός λειτουργεί μόνο για αβέβαιες περιπτώσεις.
Οι ανιχνευτές μπορούν να αποτύχουν.
// Circuit breaker per detector
private void RecordFailure(string detectorName)
{
var state = _circuitStates.GetOrAdd(detectorName, _ => new CircuitState());
state.FailureCount++;
state.LastFailure = DateTimeOffset.UtcNow;
if (state.FailureCount >= CircuitBreakerThreshold)
{
state.State = CircuitBreakerState.Open;
// Detector disabled until reset time passes
}
}
Οι αποτυχημένοι ανιχνευτές είναι προσωρινά απενεργοποιημένοι. πίεση επιλογής σε επίπεδο υποδομής.
Όταν το σύστημα ανιχνεύει με μεγάλη αυτοπεποίθηση, μαθαίνει με δημοσίευση στο λεωφορείο μαθησιακών εκδηλώσεων:
private void PublishLearningEvent(AggregatedEvidence result, ...)
{
var eventType = result.BotProbability >= 0.8
? LearningEventType.HighConfidenceDetection
: LearningEventType.FullDetection;
_learningBus.TryPublish(new LearningEvent
{
Type = eventType,
Confidence = result.Confidence,
Label = result.BotProbability >= 0.5,
Metadata = new Dictionary<string, object>
{
["botProbability"] = result.BotProbability,
["categoryBreakdown"] = result.CategoryBreakdown,
["contributingDetectors"] = result.ContributingDetectors
}
});
}
Αυτό τροφοδοτείται από το κατάστημα βάρους, ενημερώνοντας τον ερωτικό ανιχνευτή που έμαθε βάρη με την πάροδο του χρόνου.
Αντί για έναν ενιαίο εγκέφαλο "AI," το DiSE χρησιμοποιεί στρωματοποιημένη νοημοσύνη:
flowchart TB
subgraph Fast["Fast Path (< 100ms)"]
H[Static Heuristics]
D[Detectors]
ML[Learned Heuristic Model]
end
subgraph Slow["Slow Path (Async)"]
LLM[Ollama LLM]
end
subgraph Learn["Learning Layer"]
W[Weight Store]
Rep[Reputation]
end
Fast --> |escalate uncertain| Slow
Slow --> |label| Learn
Learn --> |update weights| Fast
style Fast stroke:#10b981,stroke-width:2px
style Slow stroke:#6366f1,stroke-width:2px
style Learn stroke:#f59e0b,stroke-width:2px
Σωλήνας Ταχύτητα Σκοπός |-------|-------|---------|----------------------| | Στατική Ευριστική Ενστικτωδώς απαντήσεις Γνωστό bot UA μοτίβα | Ανιχνευτές Ανάλυση κεφαλίδας, έλεγχοι IP | Μαθαίνοντας Εουριστικές Δυναμική ταξινόμηση Λογική οπισθοδρόμηση με μαθημένα βάρη | LLM Βαθιά συλλογιστική Αναλύοντας νέα μοτίβα | Εκμάθηση Βάθος ενημερώσεις, αλλαγές φήμης
Η βασική αντίληψη: το σύστημα μαθαίνει τα δικά του βάρη σε πραγματικό χρόνο. Δεν απαιτούνται εξωτερικά μοντέλα ML. Ο ερωτικός ανιχνευτής ξεκινά με λογικές προεπιλογές και εξελίσσεται με βάση την ανατροφοδότηση ανίχνευσης.
Μέλλον: Τα μοντέλα ONNX με RAG και ενσωμάτωση προγραμματίζονται για v2. Η παραγωγή του τρέχοντος ερειστικού μοντέλου χρησιμεύει ως επισήμανση των δεδομένων κατάρτισης για μελλοντική κατάρτιση μοντέλων. Η αρχιτεκτονική έχει ήδη τα "γενετικά" αντικείμενα (συμβολές, βάρη, σήματα) που κάνουν την προσθήκη κατευθυνόμενη συνθετική εξέλιξη απλή - έχει σχεδιαστεί ως σημείο plugin.
Αυτή η βιολογική αντίληψη καθρεφτίζει:
Αντί να μεταφέρει ένα εξωτερικό μοντέλο ML, το σύστημα μαθαίνει το δικό του ταξινομητή χρησιμοποιώντας απλή γεωλογική παλινδρόμηση με δυναμική εξαγωγή χαρακτηριστικών:
public class HeuristicDetector : IDetector
{
// Default weights - sensible starting points
private static readonly Dictionary<string, float> DefaultWeights = new()
{
// Human-like patterns (negative = more likely human)
["hdr:accept-language"] = -0.6f,
["hdr:referer"] = -0.4f,
["fp:received"] = -0.7f, // Fingerprint = strong human signal
["fp:legitimate"] = -0.8f,
// Bot indicators (positive = more likely bot)
["ua:contains_bot"] = 0.9f,
["ua:headless"] = 0.8f,
["ua:selenium"] = 0.7f,
["ua:curl"] = 0.6f,
["accept:wildcard"] = 0.4f,
};
private (bool IsBot, double Probability) RunInference(Dictionary<string, float> features)
{
// Simple linear model: score = bias + Σ(feature * weight)
float score = _bias;
foreach (var (featureName, featureValue) in features)
{
var weight = _weights.TryGetValue(featureName, out var w)
? w
: DefaultNewFeatureWeight;
score += featureValue * weight;
}
// Sigmoid gives us probability
var probability = 1.0 / (1.0 + Math.Exp(-score));
return (probability > 0.5, probability);
}
}
Τα χαρακτηριστικά εξάγονται δυναμικά από το αίτημα και τα συγκεντρωτικά στοιχεία:
public static class HeuristicFeatureExtractor
{
public static Dictionary<string, float> ExtractFeatures(
HttpContext context,
AggregatedEvidence evidence)
{
var features = new Dictionary<string, float>();
// Request metadata
features["req:header_count"] = Math.Min(headers.Count / 20f, 1f);
features["req:cookie_count"] = Math.Min(cookies.Count / 10f, 1f);
// Header presence
features["hdr:accept-language"] = headers.ContainsKey("Accept-Language") ? 1f : 0f;
// UA patterns (dynamic - only present if detected)
if (ua.Contains("bot")) features["ua:contains_bot"] = 1f;
if (ua.Contains("selenium")) features["ua:selenium"] = 1f;
// Detector results (named by actual detector)
foreach (var contrib in evidence.Contributions)
features[$"det:{contrib.DetectorName}"] = contrib.ConfidenceDelta;
// Client-side fingerprint - STRONG human signal
if (hasFingerprint)
{
features["fp:received"] = 1f;
features["fp:legitimate"] = 1f;
}
return features;
}
}
Τα νέα χαρακτηριστικά παίρνουν αυτόματα προεπιλεγμένα βάρη και μαθαίνουν με την πάροδο του χρόνου. Το σύστημα ανακαλύπτει τι έχει σημασία.
Τα βάρη παραμένουν στο SQLite και ενημερώνονται μέσω εκθετικού μέσου όρου κίνησης:
public class SqliteWeightStore : IWeightStore
{
public async Task RecordObservationAsync(
string signatureType,
string signature,
bool wasBot,
double detectionConfidence,
CancellationToken ct = default)
{
// EMA update: weight = weight * (1 - α) + new_value * α
var alpha = 0.1; // Learning rate
var weightDelta = wasBot ? detectionConfidence : -detectionConfidence;
var sql = @"
INSERT INTO learned_weights (signature_type, signature, weight, ...)
VALUES (@type, @sig, @delta, ...)
ON CONFLICT(signature_type, signature) DO UPDATE SET
weight = weight * (1 - @alpha) + @delta * @alpha,
confidence = MIN(1.0, confidence + @conf * 0.01),
observation_count = observation_count + 1,
last_seen = @now
";
await ExecuteAsync(sql, ...);
}
}
Αυτό είναι μετάλλαξη μέσω παρατήρησηςΚάθε ανίχνευση διδάσκει κάτι στο σύστημα. Με τον καιρό, τα βάρη συγκλίνουν προς τις βέλτιστες τιμές για τα συγκεκριμένα μοτίβα κυκλοφορίας σας.
Στο DiSE, η ψευδαίσθηση LLM δεν είναι έντομο, είναι το εκφυλιστικό υπόστρωμα της εξέλιξης.
Ένα LLM υψηλής θερμοκρασίας που προτείνει δέκα παραλλαγές ενός κανόνα ανίχνευσης δεν είναι "παραίσθηση" - είναι μετάλλαξη του γονιδιώματος του συστήματος:
public async Task<List<DetectionRule>> GenerateMutationsAsync(DetectionContext context)
{
var prompt = $"""
Given this traffic pattern:
{JsonSerializer.Serialize(context)}
Generate 5 variant detection rules that might catch similar patterns.
Return JSON array of rules with: pattern, weight, confidence.
Be creative. Some variants should be strict, some lenient.
""";
var response = await _ollama.GenerateAsync(new GenerateRequest
{
Model = "gemma3:1b",
Prompt = prompt,
Options = new RequestOptions { Temperature = 0.9 } // High creativity
});
return ParseRules(response.Response);
}
Στη συνέχεια, οι μεταλλάξεις αξιολογούνται με βάση ιστορικά δεδομένα:
public async Task<DetectionRule?> SelectFittestAsync(
List<DetectionRule> mutations,
List<LabeledRequest> testData)
{
var results = new List<(DetectionRule Rule, double Fitness)>();
foreach (var rule in mutations)
{
var tp = testData.Count(r => rule.Matches(r) && r.IsBot);
var fp = testData.Count(r => rule.Matches(r) && !r.IsBot);
var fn = testData.Count(r => !rule.Matches(r) && r.IsBot);
// F1 score as fitness
var precision = tp / (double)(tp + fp);
var recall = tp / (double)(tp + fn);
var f1 = 2 * (precision * recall) / (precision + recall);
results.Add((rule, f1));
}
return results.OrderByDescending(r => r.Fitness).First().Rule;
}
Μόνο το ισχυρότερο επιβιώνει στην παραγωγή. Αυτό μετατρέπει LLMs από εύθραυστα chatbots σε εξελικτικοί φορείς.
Στο κέντρο του DiSE είναι η σύστημα πολιτικής - ονομαζόμενες διαμορφώσεις που καθορίζουν τον τρόπο με τον οποίο συμπεριφέρεται η ανίχνευση:
{
"Policies": {
"fastpath": {
"Description": "Fast path + Heuristic for sync decisions",
"FastPath": ["UserAgent", "Header", "Ip", "Behavioral", "ClientSide", "Inconsistency", "VersionAge"],
"AiPath": ["Heuristic"],
"EscalateToAi": true,
"EarlyExitThreshold": 0.15,
"ImmediateBlockThreshold": 0.90,
"Weights": {
"ClientSide": 0.2,
"Heuristic": 1.5
},
"Transitions": [
{ "WhenRiskExceeds": 0.5, "WhenRiskBelow": 0.85, "GoTo": "demo" }
]
},
"demo": {
"Description": "Full pipeline sync for demonstration",
"FastPath": [],
"AiPath": [],
"BypassTriggerConditions": true,
"ForceSlowPath": true
}
}
}
Οι πολιτικές καθορίζουν:
Το σύστημα μπορεί μετάβαση μεταξύ των μέσων πολιτικών που ζητούνΑβέβαια αποτελέσματα γρήγορου μονοπατιού κλιμακώνονται στον πλήρη αγωγό demo. προσαρμοστική δρομολόγηση - το γονιδίωμα ανταποκρίνεται σε στοιχεία σε πραγματικό χρόνο.
Δεν στέλνεις στατικές ρυθμίσεις. συμπεριφορικά είδη που προσαρμόζονται στην κίνηση.
Κάθε σύστημα DiSE βελτιστοποιεί ενάντια σε ένα τοπίο φυσικής κατάστασης:
public class FitnessEvaluator
{
public double Evaluate(GenomeConfig genome, EvaluationData data)
{
var fpRate = data.FalsePositives / (double)data.TotalHumans;
var fnRate = data.FalseNegatives / (double)data.TotalBots;
var latency = data.P99LatencyMs;
var cost = data.AiCallsPerRequest * _config.CostPerAiCall;
// Multi-objective fitness
return 1.0
- (fpRate * _config.FalsePositivePenalty) // Don't block humans
- (fnRate * _config.FalseNegativePenalty) // Don't miss bots
- (latency / _config.MaxLatencyMs) // Stay fast
- (cost / _config.MaxCostPerRequest); // Stay cheap
}
}
Δεν βελτιστοποιούμε μόνο για την ακρίβεια. επιβίωση σε δυναμικό περιβάλλον.
Πάρα πολύ AI → υψηλό κόστος, κακή καθυστέρηση. Πολύ μικρή AI → κακή ανίχνευση νέων επιθέσεων. Πάρα πολύ επιθετική → ψευδή θετικά, θυμωμένοι χρήστες. Πολύ επιεικής → πλημμύρες bot.
Το σύστημα πρέπει να βρει μια σταθερή ισορροπία.
Ένα ώριμο σύστημα DiSE μετατοπίζει τον ΑΙ από την καυτή διαδρομή:
flowchart TB
subgraph Early["Early Stage"]
AI1[AI handles most cases]
end
subgraph Middle["Middle Stage"]
AI2[AI handles edge cases]
H1[Heuristics handle common cases]
end
subgraph Mature["Mature Stage"]
AI3[AI teaches and mutates]
H2[Heuristics handle almost everything]
M[Memory provides context]
end
Early --> Middle --> Mature
style Early stroke:#ef4444,stroke-width:2px
style Middle stroke:#f59e0b,stroke-width:2px
style Mature stroke:#10b981,stroke-width:2px
Με την πάροδο του χρόνου:
Η AI γίνεται:
Δεν είναι εξάρτησή μου, προσαρμοστική σκαλωσιά.
Με την YARP Gateway, αυτή η αρχιτεκτονική επιτρέπει κάτι νέο: δρομολόγηση συμπεριφοράς.
Παραδοσιακή δρομολόγηση είναι στατική: διαδρομή → backend. Συμπεριφορική δρομολόγηση είναι αντανακλαστική: χαρακτηριστικά κυκλοφορίας → δυναμικές αποφάσεις δρομολόγησης.
flowchart LR
subgraph Gateway["YARP Gateway"]
D[Detector Team]
P[Policy Engine]
R[Router]
end
Traffic[Traffic] --> D
D --> P
P --> R
R -->|Human| App[Your App]
R -->|Bot| Block[403]
R -->|Uncertain| Challenge[Challenge]
R -->|Learning| Queue[Async Analysis]
style Gateway stroke:#10b981,stroke-width:2px
Οι βασικές έννοιες:
Αυτό δεν είναι απλά "ανακάλυψη ρομπότ στην άκρη." Είναι ένα νέο δρομολόγηση πρωτόγονο όπου οι ροές κυκλοφορίας διαμορφώνονται από μαθημένα πρότυπα συμπεριφοράς, όχι μόνο στατικούς κανόνες.
Οι περισσότεροι μηχανικοί πολιτισμοί φοβούνται:
Το DiSE χρησιμοποιεί αυτά ως οικοδομικά υλικά.
Τα στατικά συστήματα πεθαίνουν.
Κάθε βιομηχανία που ασχολείται με αντιπάλους, παρασυρόμενα, ή πίεση κλίμακας θα χρειαστεί τελικά αρχιτεκτονικές όπως αυτή:
Επιτρέψτε μου να είμαι σαφής σχετικά με το τι δεν είναι αυτό:
Το DiSE ελέγχεται, εξηγείται η εξέλιξη:
Είναι κατευθύνεται εξέλιξη - καθοδηγούμενη, όχι τυχαία.
ως επί το πλείστον διαυγής. botdetection εφαρμόζει τις αρχές αυτές:
dotnet add package Mostlylucid.BotDetection
builder.Services.AddBotDetection();
app.UseBotDetection();
Ρύθμιση για παραγωγή με ενεργοποίηση μάθησης:
{
"BotDetection": {
"BotThreshold": 0.7,
"Policies": {
"default": {
"FastPath": ["UserAgent", "Header", "Ip", "Behavioral", "ClientSide", "Inconsistency", "VersionAge"],
"AiPath": ["Heuristic", "Llm"],
"EscalateToAi": true,
"EarlyExitThreshold": 0.85
}
},
"AiDetection": {
"Provider": "Heuristic",
"Heuristic": {
"Enabled": true,
"LoadLearnedWeights": true,
"EnableWeightLearning": true,
"LearningRate": 0.01
}
}
}
}
Ο ερωτικός ανιχνευτής μαθαίνει από κάθε αίτημα, ενημερώνοντας τα βάρη του για να ταιριάζει με τα μοτίβα κυκλοφορίας σας.
DiSE Αρχιτεκτονική είναι η μετατόπιση από το λογισμικό ως μηχανές στο λογισμικό ως οργανισμοί.
Είναι η αρχιτεκτονική του:
Οι στατικές αρχιτεκτονικές δεν μπορούν να συμβαδίζουν με δυναμικά περιβάλλοντα. Οι επιτιθέμενοι εξελίσσονται. Οι χρήστες εξελίσσονται. Οι απαιτήσεις εξελίσσονται.
Τα συστήματα πρέπει να εξελιχθούν επίσης.
Αν θέλετε συστήματα που απλά λειτουργούν, φτιάξτε τα με τον παλιό τρόπο. Αν θέλεις συστήματα Επιβίωσε. - χτίστε τα με το DiSE.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.