# अभिलेखों के साथ मेरे पुराने ब्लॉग का पुनरुत्थान और C# के एक लूत

<!--category-- Imported, .NET, Archive.org -->
<datetime class="hidden">2025-11-24T12:00</datetime>

तो शायद आपने सैकड़ों लोगों को देखा हो ["नया" ब्लॉग पोस्ट](https://www.mostlylucid.net/blog/category/Imported) हाल ही में दिखाई दी. खैर, वे सब में नया नहीं कर रहे हैं - वे कहा जाता है की तरह . जैसे, 2004 पुराने. मैं अंत में डिजिटल कब्र के किनारे से मेरी सामग्री को बचाने के लिए एक औजार बना दिया है जो कि आमतौर पर मेरा पुराना ब्लॉग था.

## अभिलेख क्यों.org वास्तव में ब्रिटियन है

इससे पहले कि मैं तकनीकी सामग्री में डूब जाऊँ, मुझे एक विशाल शोर देना होगा [इंटरनेट अभिलेख](https://archive.org/) और उनके सीधे मशीन. इस गैर-प्रयोगक संगठन को १९९६ से वेब पृष्ठों को सुरक्षित रखने वाले अरबों वेब पृष्ठों को सुरक्षित रखा गया है जो अन्यथा हमेशा के लिए खो दिया जाएगा.

एक दूसरे के बारे में सोचो. हर ब्लॉग पोस्ट में आपने 2005 में लिखा है, हर ब्लॉग पोस्ट में, मेरे लिए सबसे अच्छा मौका है कि यह अभी भी अभिलेख के माध्यम से उपलब्ध है. वे अनिवार्य रूप से पूरे इंटरनेट के एक संग्रहालय चल रहे हैं, दानों और दानों द्वारा दानों से दानों.

जब मेरे पुराने मेजबानों के मालिक गायब हो गए (मैं इस तरह के लिए मेरे बैकअप के साथ एक साझा, मैं सोचा कि सभी सामग्री हमेशा के लिए चला गया था. बाहर आंकड़ा बंद करें मार्गबैक मशीन सालों के लिए मेरी साइट का उपयोग किया गया था.org काफी 6+2 साल के लिए अपने ब्लॉगिंग इतिहास के बारे में काफी सुरक्षित रखा गया है.

यदि तुमने उन्हें कुछ भी नहीं दिया है, तो ऐसा करने पर विचार कीजिए। वे हमारे सामूहिक डिजिटल इतिहास को सुरक्षित रख रहे हैं।

## समस्या: मेरा ब्लॉग मेम्स था

सन्‌ 2004 से 2010 तक एक ब्लॉग चलाने के बारे में बात यह है कि उस समय के दौरान एक वेब तकनीक बदल गई. और जाहिर है, मैंने अपने ब्लॉग सेटअप को कम से कम तीन बार बदल दिया:

1. **आरंभिक दिन (2004)**: कुछ घर के अंदर जो लिखा हुआ था `<div class="post">` एक के अंदर `<form>` तत्व (क्योंकि सब कुछ उस समय एक फार्म था)
2. **मध्य- बीच**: अलग - अलग जगहों में टैम्प्लेट संरचना, तारीख
3. **साल बाद**: फिर भी थोड़ा अलग अणुओं के साथ एक और मोड़

मेमोरी से इसे फिर कुछ मनपसंद बात इस्तेमाल किया जाता है [उप- पाठ](http://beletsky.net/2010/09/subtext-open-source-blogging-engine.html) (P) ब्लॉगिंग की ब्लॉगिंग चीज. समाजीय सर्वर के अनुसार चलना (A) [गोल](https://community.telligent.com/) एक बात. गुप्त रूप से सेना साइटों का उपयोग करने के लिए इस्तेमाल किया जाता था , एक और पूर्व में, SEATCPAT रॉबार्ड हॉवर्ड द्वारा . जिनमें से सभी अलग तरीके थे अद्यतन और सामग्री प्रदर्शित करने के अलग तरीके.

इसका अर्थ था कि किसी भी निकासी उपकरण को बहुत से एचटीएमएल संरचनाओं को नियंत्रित करने के लिए ढीला होना आवश्यक था. एक "एक आकार सभी तरह के रूप में फिट हो जाता है" तो उसे काटने के लिए नहीं जा रहा था.

## अभिलेख एमुलेटर आयातर भरें

मैंने बनाया [अभिलेखउसके द्वारा आयात किया जा रहा है](https://github.com/scottgal/mostlylucid.nugetpackages/tree/main/Mostlylucid.ArchiveOrg) इस बहुत स्पष्ट समस्या को हल करने के लिए. यह एक 90 है.

1. **अभिलेखक.org का उपयोग सीमा** - वे दान पर चल रहे गैर-प्रयोग कर रहे हैं, तो उनके सर्वरों का रोना एक भयानक काम होगा
2. **कॉन्फ़िगर करने योग्य तिथियों के बीच अभिलेखित पृष्ठ डाउनलोड करें**
3. **बहुत से एचटीएमएल संरचनाों से ब्लॉग सामग्री निकालें**
4. **साफ मार्क स्थान उत्पन्न करता है** मेरे मौजूदा ब्लॉग फ़ॉर्मेट में
5. **उपयोगी टैग तैयार करने के लिए ओलमा इस्तेमाल करता है** - क्योंकि क्यों नहीं लगता कि यह पर कुछ जादू फेंक?

### यह कैसे कार्य करता है

औज़ार तीन मुख्य चरणों के साथ क्लीप्चरीशन का पालन करता है:

```
Archive.org CDX API → Download HTML → Convert to Markdown → Generate Tags → Output Files
```

#### फेस 1: अभिलेखक क्वैरी किया जा रहा है

औज़ार अभिलेखों का उपयोग कर रहा है.org [सीडीएक्स एपीआई](https://github.com/internetarchive/wayback/tree/master/wayback-cdx-server) मेरे ब्लॉग के सभी अभिलेखों को ढूंढने के लिए. यह एपीआई है जो कि समय- सारिणीबद्ध यूआरएलों की सूची देता है, माइम क़िस्म, तथा एचटीटीपी स्थिति कोड.

```csharp
// The CDX query builds a URL like this:
// https://web.archive.org/cdx/search/cdx?url=mostlylucid.co.uk/posts/&output=json&collapse=urlkey
```

वह `collapse=urlkey` पैरामीटर चतुर है - यह प्रत्येक अद्वितीय यूआरएल के लिए सिर्फ नवीनतम स्नेपशॉट बताता है, जो आपको डुप्लीकेट की संख्या को नाटकीय रूप से कम करता है.

मैं यूआरएलों को फ़िल्टर करने के लिए गिम्प पैटर्न का भी उपयोग करता हूँ. मेरे पुराने पोस्ट पैटर्न पैटर्न पैटर्न के अनुसार `/posts/[number].aspx`, ऐसा:

```json
{
  "IncludePatterns": ["/posts/\\d+\\.aspx$"]
}
```

इस तरह मैं सिर्फ वास्तविक ब्लॉग पोस्टों को ही पकड़ लेता हूँ, अभिलेख पृष्ठ, वर्ग पृष्ठ, या RSS फीड नहीं.

#### PROT 2: सही नागरिक होने की वजह से लोगों की दर कम हो जाती है

अभिलेख.org एक सार्वजनिक सेवा है. उनके पास गूगल या एमएम का इंफ्रा बजट नहीं है. तो डाउनलोडकर्ता जानबूझकर है:

```csharp
// Default: 5 seconds between requests, single-threaded downloads
"RateLimitMs": 5000,
"MaxConcurrentDownloads": 1
```

जी हाँ, इसका अर्थ है सैकड़ों पोस्ट डाउनलोड हो जाते हैं। लेकिन यह करने के लिए सही बात है। उपकरण 429 तक संभालता है।

डाउनलोड फ़ाइलों के लिए आवश्यक कुछ साफ सफाई भी है. अभिलेखक औज़ार पट्टी स्क्रिप्ट को जोड़ता है तथा पकड़ वाले एचटीएमएल में यूआरएल फिर से लोड करता है. डाउनलोडर जो कुछ बाहर है:

```csharp
private static string CleanWaybackArtifacts(string html)
{
    // Remove the interactive Wayback toolbar
    html = WaybackToolbarRegex().Replace(html, string.Empty);
    // Remove playback.archive.org script references
    html = WaybackScriptRegex().Replace(html, string.Empty);
    // Strip archival metadata comments
    html = WaybackCommentRegex().Replace(html, string.Empty);
    // Rewrite archived URLs back to original paths
    html = WaybackUrlRewriteRegex().Replace(html, "$1$2");
    return html;
}
```

गिम्प पैटर्न हैंडलः

- `<!-- BEGIN WAYBACK TOOLBAR INSERT -->...<!-- END WAYBACK TOOLBAR INSERT -->` - औजारपट्टी एचटीएमएल
- `<script>` टैग जिसपरपेलिंग `playback.archive.org`
- मेटाडेटा टिप्पणी अभिलेखित करें
- यूआरएल उपसर्ग जैसे `https://web.archive.org/web/20040527/` सभी कड़ियों को पहले से ही शामिल किया गया है

#### फेस 3: सामग्री इंटरेक्शन के बारे में

मैं अपने ब्लॉग का उल्लेख तीन बार करता है? यहाँ मैं इसे कैसे संभालता हूँ. मुझे याद है कि मेरे ब्लॉग का उल्लेख तीन बार किया है.

प्राथमिक एक्सपोजर एक सीएसएस चयनक का उपयोग करता है:

```json
{
  "ContentSelector": "div.post"
}
```

लेकिन यहाँ एक मजाक है मेरी पुरानी साइट के कुछ संस्करणों में, `div.post` मैं एक भरा था `<form>` तत्व. कोड को अनचाहा तत्वों को हटाने से पहले वस्तु को निकालने के लिए है अन्यथा हटाने के लिए `<form>` टैग कोक वास्तविक ब्लॉग सामग्रीः

```csharp
// In ConvertFileAsync - the order here is critical
var contentNode = ExtractMainContent(doc);
if (contentNode == null)
{
    _logger.LogWarning("Could not find main content in {File}", htmlFilePath);
    return articles;
}

// NOW we can safely remove unwanted elements from within the extracted content
RemoveUnwantedElementsFromNode(contentNode);
```

वह `ExtractMainContent` विषय- वस्तु ढूंढने के लिए विधि

```csharp
// For selectors like "div.post", split and search by element + class
node = doc.DocumentNode.Descendants()
    .FirstOrDefault(n =>
        n.Name.Equals(elementName, StringComparison.OrdinalIgnoreCase) &&
        HasExactClass(n, className));
```

औज़ार के पास चेक चयनक भी है यदि मुख्य असफल हो तो:

1. `div.blogpost`, `div.singlepost`, `article`
2. `#content`, `#main-content`, `#PostBody`
3. `.post-content`, `.entry-content`, `.article-content`
4. अंत में, सिर्फ `<body>` यदि अन्य सभी असफल हों

फिर तत्वों की एक लंबी सूची के बाद सामग्री निकासक को निकालने के लिए है:

```json
{
  "RemoveSelectors": [
    "nav", "header", "footer", ".sidebar", ".advertisement",
    ".comments", ".social-share", ".related-posts", "script",
    "style", "noscript", "iframe", "#commentform", ".postNav"
  ]
}
```

#### फेस ४: मार्क अवशोषित बनाना

एक बार हम HTML सामग्री साफ है, [खड़ा उलटा](https://github.com/mysticmind/reversemarkdown-net) इसे GiB-fovod निशान नीचे करने के लिए परिवर्तित करने के भारी निर्माण को संभालता है.

लेकिन आउटपुट को कुछ डाक- प्रक्रिया की जरूरत है. पुराना HTML अक्सर अजीब हाशिया होता है जो मरकुस के पाराधन (वर्तमान में कोड ब्लॉक हो जाता है!) तो वहाँ साफ- सफाई:

```csharp
// Removes leading whitespace from non-code lines
// Preserves code block formatting (respects ``` fences)
// Removes excessive blank lines (max 2 consecutive)
```

अंतिम आउटपुट में मेरे ब्लॉग के सामने के विषय फ़ॉर्मेट शामिल हैं:

```markdown
# Article Title

<datetime class="hidden">2004-05-27T23:21</datetime>
<!--category-- mostlylucidcouk, Imported, SomeCategory -->

Article content here...
```

#### PRT 5:LM- पावर टैग बनाने के लिए

अब मजेदार भाग के लिए. पुराने ब्लॉग पोस्टों में अक्सर कोई टैग नहीं था, या टैग नहीं था जो मेरी वर्तमान साइट संरचना के लिए मतलब नहीं था. तो मैं विषयवस्तु का विश्लेषण करने के लिए और तार्किक टैग तैयार करता हूँ.

कॉन्फ़िगरेशन सीधा हैः

```json
{
  "Ollama": {
    "BaseUrl": "http://localhost:11434",
    "Model": "gemma3:4b",
    "Temperature": 0.3,
    "MaxTags": 5,
    "Enabled": true
  }
}
```

मैं उपयोग `gemma3:4b` के रूप में यह काफी तेजी से है और बहुत सी Nams के बिना स्थानीय चलाने के लिए पर्याप्त है. कम तापमान (0.3) जारी करता है - हम हमारे टैगों में सृजनात्मक विश्लेषण नहीं चाहते. ध्यान दें, मेरे ब्लॉग के लिए यह पोस्ट छोटे थे के रूप में काम किया गया है, अगर आपका अब यकीन है कि आप अपने मॉडल के संदर्भ में फिट करने के लिए जा रहा है.

##### लंबे पोस्ट हैंडल करें

यहाँ एक व्यावहारिक सीमा है: LLM के पास संदर्भ विंडो हैं, और टैग बनाने के लिए उन्हें एक पूरा ब्लॉग पोस्ट पंप किया जा रहा है. उपकरण 3000 अक्षरों को संतुष्ट करता है:

```csharp
var truncatedContent = content.Length > 3000
    ? content[..3000] + "..."
    : content;
```

टैग पीढ़ी के लिए, पहले 3000 अक्षर आम तौर पर इस पोस्ट के बारे में क्या है यह समझने के लिए पर्याप्त संदर्भ रखता है.

```
Generate up to 5 tags, short (1-3 words), focusing on:
.NET, C#, ASP.NET, JavaScript, Docker, Database, API, Security, DevOps, Cloud
```

प्रतिक्रिया विश्लेषण बचाव है - यदि ओएलमा मिट्टी या बार बाहर लौटा देता है, तो हम सिर्फ एक खाली टैग सूची प्राप्त कर लेते हैं पूरे mutioligio.

### प्रारंभिक तिथि:

मूल प्रकाशन तारीख खोजने में आश्चर्य है। मेरे पुराने ब्लॉग ने वर्षों के दौरान अलग अलग स्थानों में तारीख़ जमा की है। उपकरण बहुत सी योजनाओं की कोशिश करता है:

1. **संकेतक पर कॉन्फ़िगर करें** ( ई. `.postfoot`)
2. **मेटा टैग**: `article:published_time`, `DC.date.issued`
3. **एचटीएमएल5 `<time>` तत्वों के नाम**
4. **साझा तिथि क्लास**: `.date`, `.post-date`, `.entry-date`
5. **रेएक्स पैटर्न** रॉ HTML (आईएसओ प्रारूप, अवतरित किया गया, आदि.)
6. **फालबैक**: अभिलेख तिथि स्वयं

एक विशेष रूप से परेशान मेरे पुराने ब्लॉग टैम्प्लेट के लिए "क्लास में प्रेरित किया गया था, मई 27, 2004" वाक्यांश. वहाँ उस के लिए विशेष व्याख्या है.

### पाइपलाइन पिक्शन

सबसे ठंडा किला सा कैसे डाउनलोड करें और समानांतर उपयोग में परिवर्तनों में चल रहा है:

```csharp
var channel = Channel.CreateBounded<string>(10);

// Producer: downloads and writes file paths to channel
// Consumer: reads file paths and converts to markdown
```

इसका अर्थ है कि परिवर्तन जैसे ही पहली फ़ाइल डाउनलोड शुरू होता है, सभी डाउनलोड करने के लिए इंतजार करने के बजाय. बाध्य करने की क्षमता (10 वस्तुएँ) वापस लौटते हैं - यदि परिवर्तन के पीछे गिर जाता है तो कम से कम हो जाता है.

## सीमाएँ तथा मिल गया

चलो इस औज़ार क्या नहीं कर सकते हैं के बारे में ईमानदार हो सकते हैं:

1. **यह मेरे ब्लॉग के लिए बहुत विशिष्ट है** - संकेतक, पैटर्न, और तारीख निकासों सभी के लिए उपयोग कर रहे हैं आमतौर पर .को.को. आपको एक अलग साइट के लिए सब कुछ मनपसंद बनाने की जरूरत होगी.

2. **अभिलेख.org में सबकुछ नहीं है** - कुछ पृष्ठों को अभिलेखित नहीं किया गया था, या टूटी सीएसएस/image के साथ अभिलेखित किया गया था.

3. **छवियाँ सबसे अच्छी तरह से तैयार की गई हैं** - उपकरण सीधेबैक मशीन से छवियों को डाउनलोड करने की कोशिश करता है, लेकिन कई हमेशा के लिए चला रहे हैं.

4. **हर जगह मृत लिंक** - 2004 से लेकर उन साइटों के लिए बाहरी लिंक जो अब मौजूद नहीं हैं. मैं इस के लिए एक अलग समाधान पर काम कर रहा हूँ (ऑप्टिक अभिलेख.org लिंक जल्द ही आ रहे हैं!)

5. **LLM टैग अपरिपूर्ण हैं** - ओलमा-ब्रेंट टैग आम तौर पर समझदार होते हैं, लेकिन कभी - कभी निशान चूक जाते हैं. मैनुअल समीक्षा की सिफारिश की जाती है.

6. **सीडीएक्स एपीआई ट्रॉण्डल** - हज़ारों पृष्ठों के साथ साइटों के लिए, सीडीX एपीआई परिणाम लौट सकते हैं. कोड इस स्वादिष्टता को संभालता है लेकिन आप कुछ पृष्ठ याद कर सकते हैं.

## चल रहा है

यदि आप इसे अपने साइट के लिए अनुकूल बनाना चाहते हैं (यह आवश्यक है) कमांड हैं:

```bash
# Full pipeline (download + convert)
dotnet run -- full

# Just download HTML from Archive.org
dotnet run -- download

# Just convert existing HTML files to Markdown
dotnet run -- convert
```

औज़ार सुकर बन्द करने का समर्थन करता है (Ctrl+C) और इससे फिर बहाल कर सकता है जहाँ से फ़ाइलों को स्थानीय रूप से कैश कर दिया गया है.

## परिणाम

इसके बाद मैं अपने पुराने ब्लॉग को चलाने के बाद, मैंने पोस्टों को फिर से खोज निकाला [1 जनवरी, 2004](/blog/365) उनके द्वारा पढ़ा जाना समय के माध्यम से एक रोमांचक यात्रा है। जेजी से पहले वेब विकास चर्चा थी। Query से पहले के बारे में पोस्ट के बारे में कि अब पूरी तरह से लुप्त हो रहे हैं। और कुछ शर्मपूर्ण विचार मैं एक छोटे डेवलपर के रूप में आयोजित किया गया था।

आप सभी आयातित पोस्टों को खोज सकते हैं [आयातित](/blog/category/Imported) वर्ग टैग.

## अगला क्या है

आयात सामग्री मृत कड़ियों की एक milling है - कि सिर्फ 20 साल के वेब सामग्री की प्रकृति है. मैं [बीच का समाधान बनाया गया](/blog/the-war-on-404) कि:

1. पुराने यूआरएल के लिए 404 का पता लगाएँ
2. स्वचालित अभिलेखों को स्वचालित ढूंढते हुए मिला.org स्नैपशॉट
3. अभिलेख संस्करण को पुनर्प्रेषित या प्रदर्शित करें

## लपेटें अप

इस उपकरण को बनाने के लिए एक सप्ताहांत परियोजना थी कि कुछ वास्तव में उपयोगी काम में बदल गया है. यदि आप एक पुराने ब्लॉग से सामग्री खो दिया है, वहाँ एक अच्छा मौका अभिलेख है. और अगर आप सी# के साथ आराम कर रहे हैं, तो तकनीकों यहाँ (सीडीXBBSESEDS, ELCACACACACATENDCANTENDS, EL) अपनी परियोजना को ठीक करने के लिए तैयार किया जा सकता है. यदि आप अपने पुराने ब्लॉग से संतुष्ट हो गया है, तो वहाँ एक अच्छा मौका अभिलेख है.

कोड पर है [gtykh.com/sech/ loud.net](https://github.com/scottgal/mostlylucid.nugetpackages/tree/main/Mostlylucid.ArchiveOrg)यह एक शानदार पुस्तकालय नहीं है - यह मेरी विशिष्ट स्थिति के लिए एक उद्देश्य माध्यम उपकरण है - लेकिन यह आप अपने खुद के अभिलेखीय जोखिमों के लिए विचारों दे सकता है.

और गंभीरता से, अभिलेखों को दान देने के लिए जाओ. वे महत्वपूर्ण काम कर रहे हैं.