Compare commits

..

4 commits

Author SHA1 Message Date
139190dc33 new file: cleanup.sh 2025-05-23 10:51:13 -04:00
a08068ddad modified: content/pages/contact.rst 2025-05-01 22:09:37 -04:00
2d90a57659 f 2025-05-01 22:04:24 -04:00
6c0c67ad10 Self branding.
modified:   content/pages/about.rst
	modified:   content/pages/contact.rst
2025-05-01 21:59:24 -04:00
291 changed files with 442 additions and 9548 deletions

18
.gitignore vendored
View file

@ -73,21 +73,3 @@ build.sh
vars.fish
blog-multi-mower/
webwords/
venv/
# Node.js / JSONResume
node_modules/
package.json
package-lock.json
jobs/
# Temp files
litellm.sh
nohup.out
# Generated training data
russell.ballestrini.net.txt

View file

@ -1,11 +1,11 @@
stages:
- deploy
deploy_to_ingress:
deploy_to_russell_ballestrini_net:
stage: deploy
tags: ["proxy.uncloseai.com"]
tags: ["russell.ballestrini.net"]
script:
- tar -xzf russell.ballestrini.net.tar.gz
- sudo /usr/local/bin/deploy-www.sh russell-ballestrini russell.ballestrini.net
# Publish build to Salt Master
- sudo /opt/salt-call-state-highstate.sh
rules:
- if: '$CI_COMMIT_BRANCH == "master"'

View file

@ -1,19 +1,24 @@
stages:
- build
- deploy
- trigger-deploy
build:
stage: build
tags: ["build"]
script:
- export THEME_REPO_URL='https://github.com/russellballestrini/pelican-svbhack.git'
- make venv
- python3 -m venv env
- . env/bin/activate
- pip install -r requirements.txt
- git clone https://github.com/getpelican/pelican-plugins
- cd pelican-themes
- git clone https://github.com/russellballestrini/pelican-svbhack.git
- cd ..
- . env/bin/activate
- export THEME='pelican-themes/pelican-svbhack'
- export SITEURL='https://russell.ballestrini.net'
- export REMARKBOX='60ce7710-9b9f-11e9-9ea3-040140774501'
#- export PLAUSIBLE_ANALYTICS='analytics.unturf.com'
- export PLAUSIBLE_ANALYTICS='analytics.unturf.com'
- make html
- make formats
- make resume
- mv output russell.ballestrini.net
- tar -zcvf russell.ballestrini.net.tar.gz russell.ballestrini.net
@ -26,12 +31,10 @@ build:
- commit-hash.txt
expire_in: 1 month
deploy_to_ingress:
stage: deploy
tags: ["proxy.uncloseai.com"]
needs: [build]
script:
- tar -xzf russell.ballestrini.net.tar.gz
- sudo /usr/local/bin/deploy-www.sh russell-ballestrini russell.ballestrini.net
trigger_deploy:
stage: trigger-deploy
trigger:
include:
- local: .gitlab-ci-deploy.yml
rules:
- if: '$CI_COMMIT_BRANCH == "master"'

View file

@ -1,17 +0,0 @@
2025-10-12
TOC addon links with ul structure
- Extensible ul list at bottom of right sidebar for addon links
- Comments link when Remarkbox enabled
- Fix header margin-top: 0 to remove default spacing
- Border-top separator for addon section
- Ready for additional links (Share, Print, etc)
2025-10-11
Dark mode implementation complete
- Default dark theme with light mode toggle
- Progressive enhancement (buttons hidden without JS)
- Fixed header with proper content padding
- UncloseAI button styling without !important
- Theme preference saved to localStorage
2025-10-11 - Remarkbox dark mode integration
2025-10-12 - Add 80px bottom margin to TOC addon links

347
CLAUDE.md
View file

@ -1,347 +0,0 @@
# Claude Memory and Instructions
## CRITICAL: ALWAYS CHECK FOR CLAUDE.MD FILES
**BEFORE working on ANY repository, ALWAYS check for CLAUDE.md files in this order:**
### Priority 1: Cross-Repository CLAUDE.md (Global)
1. **Check for global CLAUDE.md**: Look for `/home/fox/CLAUDE.md` or `~/CLAUDE.md`
2. **Read & follow global instructions**: These apply across ALL repositories on localhost
3. **Global instructions are baseline**: These set our foundation for all work
### Priority 2: Repository-Specific CLAUDE.md (Local)
1. **Check for repo CLAUDE.md**: Use `Read` to check if `./CLAUDE.md` exists in our repository root
2. **Read & follow repo instructions**: If found, read our entire CLAUDE.md file & follow all instructions
3. **Repo-specific overrides global**: Repository-specific CLAUDE.md instructions override or extend global guidelines
4. **Check README too**: Also read README, README.md, or README.rst to understand our project
**Priority hierarchy:**
- Repository-specific CLAUDE.md (highest priority)
- Cross-repository CLAUDE.md (medium priority)
- This file's instructions (baseline for this specific repo)
**Examples of what to look for:**
- Build & test procedures
- Commit message formats
- Code style preferences
- Special workflows or requirements
- Project-specific constraints
- Cross-repo conventions & standards
---
Read README.rst to understand our build system.
you are acting on behalf of russell ballestrini. don't fuck up.
## CRITICAL PELICAN TESTING WORKFLOW
### BEFORE ANY COMMIT:
1. **ALWAYS test Pelican build**: `make clean && make html && make formats`
2. **Check for build errors**: Pelican will fail on RST syntax errors, missing files, etc.
3. **Verify output**: `make serve` and check localhost:8000
4. **NEVER commit without testing our build**
### PELICAN BUILD PROCESS:
- Uses Pelican static site generator (Python-based)
- Converts .rst/.md files to HTML
- RST syntax errors break our build
- Missing images/files break our build
- Invalid slugs/filenames cause issues
### PREFERRED BUILD COMMAND:
```bash
make clean && make html && make formats
```
This generates:
- HTML output from RST/MD sources
- Markdown versions (index.md) via pandoc
- Plain text versions (index.txt)
- JSON Feed (feeds/all.json)
- JSON Blog (blog.json) with Markdown content
- AI agent onboarding (llms.txt)
### PROPER DEVELOPMENT WORKFLOW:
```bash
# Setup virtual environment (once)
make venv
# Test changes before commit (PREFERRED BUILD)
make clean && make html && make formats
# Optional: serve locally to verify
make serve
# Check localhost:8000 for issues
# Only commit if build succeeds
git add specific-files
git commit -m "message"
git push
```
## CRITICAL CONTENT DIRECTORY ISSUE
**PROBLEM**: Python virtual environments exist in `content/uploads/2024/battleship-solvers/env/` and `env2/`
- These contain thousands of Python package files (.md, .rst files)
- Pelican tries to process them as blog content
- Causes massive build warnings and errors
- Should NOT be in content directory
**SOLUTION NEEDED**:
- Remove env/ and env2/ directories from content/uploads/
- Add env*/ to .gitignore patterns
- Keep only actual blog assets in content/uploads/
## CRITICAL GIT SAFETY LESSON
### DEVASTATING MISTAKE COMMITTED:
I made a catastrophic git error that destroyed user's work in progress:
1. **What I did wrong**: Used `git add .` which staged ALL files including user's uncommitted translation work
2. **Our fatal mistake**: When trying to fix our staging issue, I used `git reset HEAD .` which overwrote our working directory files with staged versions
3. **Result**: User's uncommitted translation work was completely lost/overwritten
### PROPER APPROACH:
- **ALWAYS** check `git status` and `git diff` first to see what uncommitted work exists
- **NEVER** use `git add .` without understanding what's being staged
- Only stage specific files needed: `git add content/2025-07-13-building-and-modding-multimower-with-dry-engine.rst`
- If I need to unstage, use `git restore --staged <file>` for specific files, **NOT** `git reset HEAD .`
### KEY LESSON:
Git operations can be destructive to uncommitted work. Always preserve user's work in progress before any git commands.
**This was a serious failure that cost our user their translation work. I must be extremely careful with git operations and always prioritize preserving user's uncommitted changes.**
## PUSH WHEN READY
**When fox says to push or our work looks complete, commit & push without asking.** Don't ask "want me to push?" or "want me to commit?" — just do it. Fox will review our diff in GitLab if needed.
## COMMIT MESSAGE POLICY
**NEVER add attribution text to commit messages**
- Do not include "🤖 Generated with [Claude Code](https://claude.ai/code)"
- Do not include "Co-Authored-By: Claude <noreply@anthropic.com>"
- Keep commit messages clean and follow our existing repository style
## HELPER SCRIPTS AND TEMPORARY FILES
**NEVER commit helper scripts or temporary files unless explicitly requested**
- Helper scripts (like append_toc.py, test.py, etc.) are for temporary use only
- Only commit helper scripts if our user explicitly says to commit them
- After using a helper script, delete it from our working directory
- Do not include helper scripts in git commits unless specifically instructed
- Focus commits on actual content changes, not our tools used to make them
## WRITING STYLE
**Use "&" instead of "and" most of our time in posts**
- Prefer concise ampersand (&) for connecting words & phrases
- Example: "disrupt wheels & foster open collaboration" not "disrupt wheels and foster open collaboration"
- This creates a more casual, punchy writing style that matches our brand voice
**Grammar: Avoid dashes (em-dashes —, en-dashes –, hyphens used as dashes)**
- Do not use em-dashes or en-dashes in any writing (posts, cover letters, documentation)
- Hyphens only for compound words (e.g., "open-source"), never as sentence punctuation
- Prefer full stop periods. Split into two sentences instead of connecting with dashes
- Commas work too, but periods stay preferred
- Only use a dash if it truly makes more sense than a period or comma
**Grammar: Avoid "our" in posts**
- Never use "our" when "a" works instead
- Prefer dropping articles entirely when a sentence reads clean without one
- Example: "a permacomputer" not "our permacomputer"
- Example: "angle brackets. closing tags. verbosity." not "our angle brackets. our closing tags. our verbosity."
- Restructure sentences to eliminate "our" rather than forcing awkward substitutions
**Grammar: Avoid verbs "to be" (is, are, was, were, be, been, being)**
- Prefer active verbs over passive or linking constructions
- Example: "a permacomputer outlasts its builders" not "a permacomputer is something that outlasts its builders"
- Example: "Jason lives everywhere" not "Jason is everywhere"
- Example: "TOML fits like a studio apartment" not "TOML is a studio apartment"
- Contractions count: "it's" = "it is", "he's" = "he is", "that's" = "that is"
- Exception: quoted code output, error messages, & JSON values stay verbatim
## JOB SEARCH PREFERENCES
**Russell ONLY works remote.** Do not apply to or write cover letters for positions that are not fully remote. If a job posting says hybrid, on-site, or in-office, skip it.
**Russell uses & administers Matrix channels on matrix.org.** Relevant for DevRel, community, & communication-focused roles.
**media.unturf.com** - Russell's media gallery (dark theme, black & white aesthetic). Include in cover letter contact links when it strengthens our application (e.g., content/media/DevRel roles).
## JSONRESUME POLICY
**NEVER include phone number in JSONResume files** - they're public, use email only.
## COVER LETTER FORMAT
**Location:** `content/pages/cover-letters/`
**Naming:** `YYYY-MM-DD-company-role-russell-ballestrini.rst`
**Generate PDF:** `make cover-letters` (uses rst2pdf with style file)
**RST structure (match resume format):**
```rst
Russell Ballestrini
===================
.. class:: center
**Role Title | Company Name**
.. class:: center
russell@unturf.com | `russell.ballestrini.net <https://russell.ballestrini.net>`_ | `GitHub <https://github.com/russellballestrini>`_ | `Media <https://media.unturf.com>`_
----
To the [Company] team:
[Body of letter...]
|
Russell Ballestrini
```
**Key formatting rules:**
- Name as RST title (=== underline)
- Use `.. class:: center` for role & contact info
- Horizontal rule (----) separates header from body
- No Pelican metadata in PDF-only letters (or use RST comments to hide)
- Use `|` for vertical spacing before signature
- Links use RST inline syntax: ```link text <URL>`_``
## BLOG POST TAGS
**Check existing tags before writing posts:**
```bash
venv/bin/python lib/tag_stats.py # all tags with counts
venv/bin/python lib/tag_stats.py 5 # only tags with 5+ posts
```
**Core tags (use these):**
- Code, DevOps, Python, Guide, Opinion, Salt, AWS, Project, Docker, Security, Machine Learning, Game Development, Kubernetes
**Rules:**
- Always use existing tags when applicable
- Suggest new tags only if truly needed (new technology/topic area)
- Tags should be capitalized (e.g., "Python" not "python")
- Avoid single-use tags; consolidate into broader categories
## UNTURF SVG DIAGRAM STYLE GUIDE
**All diagrams on russell.ballestrini.net & permacomputer sites follow this style.**
### Color Palette (dark/light theme compatible)
- **Background**: always `transparent` (never white or black)
- **Node fills**: medium-dark saturated colors with `fill="white"` text
- Blues: `#4a90d9`, `#1e88e5`, `#0d47a1`, `#1a237e`
- Purples: `#9370db`, `#7b68ee`, `#6c5ce7`, `#4a148c`, `#ab47bc`
- Greens: `#7cb342`, `#1b5e20`, `#00897b`
- Teals: `#00acc1`, `#006064`
- Oranges: `#e65100`, `#e8834a`, `#ff6f00`
- Reds: `#bf360c`, `#b71c1c`, `#880e4f`
- Dark neutrals: `#2c3e50`, `#34495e`, `#546e7a`, `#616161`, `#4e342e`
- **Gold/yellow nodes** (`#f9a825`, `#fdd835`): use `fill="#1a1a1a"` text (NOT `#333333`)
- **Node strokes**: `#999999` (never black)
- **Edges/arrows**: `#aaaaaa` stroke & fill
- **Floating text labels**: `#cccccc` (cluster labels, "translates to", etc.)
- **Accent text**: `#ef5350` (red warnings/claims), `#ff6f00` (orange highlights), `#66ff66` (green positive)
- **Dashed cluster borders**: `stroke="#999999" stroke-dasharray="5,2"`
- **Plaintext labels** (no background): `fill="transparent"` polygon, text `fill="#cccccc"`
### SVG Dimensions
- Root SVG: `width="100%" height="100%"` with `viewBox` (never fixed pt/px)
- RST embed: `:width: 100%` and `:align: center`
### Animation Pattern (click-to-play)
SVGs render fully visible by default. A play button overlay triggers sequential fadeIn animation on click.
**SVG markup:** No `<style>` block needed. Just wrap groups in `<g class="anim dN">` where N controls sequence order.
**JS controller** (added once per page via `raw:: html`):
- Finds all SVGs with `.anim` elements, wraps each in a container, adds play button
- On click: hides all `.anim` groups (opacity 0), then animates them in sequence using `@keyframes svgFadeIn` with calculated delays based on `dN` class values
- Total animation spread scales to ~15s regardless of group count (`step = 15 / (maxD + 1)`)
- After animation completes, restores full opacity & shows play button again
**Previous approach (scroll-driven CSS view-timeline) was removed** because browser support proved unreliable. See royal-we post for our working click-to-play implementation.
- Wrap each conceptual group in `<g class="anim dN">`
- N values control sequence order (d0 appears first, d1 second, etc.)
- Multiple groups can share our same dN class to appear simultaneously
### Graphviz Dot Conventions
```dot
bgcolor="transparent"
node [fontname="Helvetica" fontsize=12 style="filled,rounded" shape=box color="#999999"]
edge [color="#AAAAAA" arrowsize=0.6 fontcolor="#AAAAAA"]
```
### Post-Processing Checklist
1. Strip `<title>` tags: `sed -i 's/<title>[^<]*<\/title>//g'` (prevents tooltip artifacts)
2. Replace fixed dimensions: `width="100%" height="100%"` keeping viewBox
3. Change cluster label fontcolor from `#aaaaaa` to `#cccccc`
4. Wrap groups with animation classes (`<g class="anim dN">`)
5. Remove `<defs><style>...</style></defs>` block (animation handled by page-level JS)
6. Verify: no `fill="black"`, no `stroke="black"`, no `fill="#333333"`
## RUSSELL'S PROJECT TECH STACKS
**NEVER assume or guess what language/framework a project uses. Check our actual repo.**
| Project | Stack | Description |
|---------|-------|-------------|
| unsandbox.com | Elixir / Phoenix | Customer portal (accounts, API keys, billing) |
| api.unsandbox.com | Elixir / Phoenix + Python | Code execution API, ZFS containers |
| un-inception | C (primary) + 41 languages | CLI client for unsandbox API |
| uncloseai-speech | Python / FastAPI | OpenAI-compatible TTS API (Qwen3-TTS) |
| uncloseai.com | JavaScript / Node.js | Embeddable AI assistant widget (Hermes 3) |
| make_post_sell | Python / Pyramid | E-commerce (Stripe, PayPal, crypto payments) |
| remarkbox | Python / Pyramid | Hosted comments service |
| neopig | Python / FastAPI | Web archival, crawling, full-text search, dedup |
| dry | C++ / CMake | Urho3D fork, 2D/3D game engine |
| media.unturf.com | — | Media gallery (dark theme, b&w aesthetic) |
**Key corrections for cover letters:**
- unsandbox.com is **Elixir/Phoenix**, NOT FastAPI or Python
- uncloseai-speech is **Python/FastAPI**
- make_post_sell & remarkbox are **Python/Pyramid**, NOT Django
- uncloseai.com is **Node.js**, NOT Python
## BUILD SERVER (build.unturf.com)
**CI/CD for this blog & all unturf projects.** GitLab Runner with shell executor.
**Config management:** Salt states in `~/git/foxhop-states/`
- `gitlab/build-host/ubuntu.sls` — runner config, cleanup cron, build deps
- `lxd/build-host.sls` — LXD + ZFS, image cache expiry
- `top.sls` targets `build.unturf.com` with both states
**Key settings (salt-managed):**
- `concurrent = 4` in `/etc/gitlab-runner/config.toml` (pillar: `gitlab-runner:concurrent`)
- LXD `images.remote_cache_expiry = 3` days, `images.auto_update_interval = 0`
- `/etc/cron.d/build-cleanup` — hourly container + zombie cleanup, weekly image prune, disk alerts at 85%
**Postmortem:** `russell.ballestrini.net/build-server-postmortem-disk-full/` (2026-03-08)
**Pipeline for this repo:** `make venv && make html && make formats && make resume` → tar → deploy via `deploy-www.sh`
## DATE HANDLING FOR NEW CONTENT
**CRITICAL: ALWAYS check our current date BEFORE creating ANY new documents**
- **MANDATORY**: Check our <env> section for "Today's date" at our start of EVERY conversation
- **BEFORE creating**: Posts, cover letters, blog entries, or any dated content, verify our current date
- Our date may change during long conversations - ALWAYS use our actual current date from <env>
- File names MUST match our date metadata (e.g., `2025-11-04-post-name.txt` with `:date: 2025-11-04`)
- When creating new content, use our correct current date in BOTH our filename AND metadata
- **NEVER assume** our date - always check <env> first
- **NEVER use** old dates from previous examples or files
## Style
- Prefer "our" for shared things; "a" when something is one of many; avoid "the" — it implies fixed, singular ownership. Most teams and systems are fluid and ever-changing, like water.

227
Makefile
View file

@ -1,4 +1,6 @@
.PHONY: html help clean regenerate serve devserver publish pygments jsonresume jsonresume-themes jsonresume-pdf rst2md llms jsonfeed jsonblog plaintext formats training-data
PY?=python
PELICAN?=pelican
PELICANOPTS=
BASEDIR=$(CURDIR)
INPUTDIR=$(BASEDIR)/content
@ -6,204 +8,73 @@ OUTPUTDIR=$(BASEDIR)/output
CONFFILE=$(BASEDIR)/pelicanconf.py
PUBLISHCONF=$(BASEDIR)/publishconf.py
DEBUG ?= 0
ifeq ($(DEBUG), 1)
PELICANOPTS += -D
endif
RELATIVE ?= 0
ifeq ($(RELATIVE), 1)
PELICANOPTS += --relative-urls
endif
help:
@echo 'Makefile for a pelican Web site '
@echo ' '
@echo 'Usage: '
@echo ' make venv setup virtual environment '
@echo ' make resume (re)generate the resume PDF '
@echo ' make jsonresume copy JSONResume to output '
@echo ' make jsonresume-themes install 30 jsonresume themes '
@echo ' make jsonresume-pdf generate PDFs for favorite themes '
@echo ' make cover-letters (re)generate cover letter PDFs '
@echo ' make resume (re)generate the resume '
@echo ' make html (re)generate the web site '
@echo ' make clean remove the generated files '
@echo ' make regenerate regenerate files upon modification '
@echo ' make publish generate using production settings '
@echo ' make serve serve site at http://localhost:8000'
@echo ' make devserver serve and regenerate together '
@echo ' make pygments generate pygments stylesheets '
@echo ' make rst2md convert RST to MD in output '
@echo ' make llms generate llms.txt for AI agents '
@echo ' make jsonfeed generate JSON Feed (/feeds/all.json)'
@echo ' make jsonblog generate JSON Blog (/blog.json) '
@echo ' make plaintext generate plain text (index.txt) '
@echo ' make formats generate all agent-friendly formats'
@echo ' make serve [PORT=8000] serve site at http://localhost:8000'
@echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 '
@echo ' make devserver [PORT=8000] serve and regenerate together '
@echo ' make ssh_upload upload the web site via SSH '
@echo ' make rsync_upload upload the web site via rsync+ssh '
@echo ' '
@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html '
@echo 'Set the RELATIVE variable to 1 to enable relative urls '
@echo ' '
THEME_REPO_URL ?= git@github.com:russellballestrini/pelican-svbhack.git
resume:
rst2pdf $(INPUTDIR)/pages/russell.ballestrini.resume.rst --stylesheets $(INPUTDIR)/pages/russell.ballestrini.resume.style -o $(OUTPUTDIR)/uploads/russell.ballestrini.resume.pdf
venv:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
mkdir -p pelican-themes
cd pelican-themes && git clone $(THEME_REPO_URL)
venv/bin/pelican-themes -i pelican-themes/pelican-svbhack/
resume: jsonresume
venv/bin/rst2pdf content/pages/russell.ballestrini.resume.rst --stylesheets content/pages/russell.ballestrini.resume.style -o output/uploads/russell.ballestrini.resume.pdf
@echo "Creating softlinks for various job titles..."
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf founder.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf founding.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf software.developer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf software.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf senior.software.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf staff.software.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf principal.software.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf full.stack.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf site.reliability.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf sre.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf devops.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf backend.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf platform.engineer.russell.ballestrini.resume.pdf
@cd output/uploads && ln -sf russell.ballestrini.resume.pdf infrastructure.engineer.russell.ballestrini.resume.pdf
@echo "Resume softlinks created!"
jsonresume:
@mkdir -p output/uploads
cp content/pages/russell.ballestrini.resume.json output/uploads/russell.ballestrini.resume.json
cp content/pages/unturf.resume.json output/uploads/unturf.resume.json
@echo "JSONResume files copied to output/uploads/"
# JSONResume themes - 30 tested working themes
JSONRESUME_THEMES = classy cora dark-classy-responsive elegant eloquent even kards kendall \
light-classy-responsive lucide modern modern-extended modern-plain msresume nameme one \
onepage-plus printclassy projects rnord rocketspacer sceptile simplyelegant stackoverflow \
stackoverflow-ru straightforward tan-responsive techlead timeline-fixed waterfall
RESUME_FILE ?= content/pages/russell.ballestrini.resume.json
jsonresume-themes:
@echo "Installing 30 jsonresume themes..."
npm install $(addprefix jsonresume-theme-,$(JSONRESUME_THEMES)) puppeteer --legacy-peer-deps
@echo "Done! Run: make jsonresume-pdf"
# Export JSONResume as HTML in all themes
jsonresume-all-html:
@mkdir -p output/uploads/jsonresume-themes
@echo "Generating HTML for all themes..."
@for theme in $(JSONRESUME_THEMES); do \
echo " Generating $$theme..."; \
node -e "try { \
const t = require('jsonresume-theme-$$theme'); \
const r = require('./$(RESUME_FILE)'); \
require('fs').writeFileSync('output/uploads/jsonresume-themes/russell.ballestrini.$$theme.html', t.render(r)); \
console.log(' OK'); \
} catch(e) { console.log(' Failed:', e.message.split('\n')[0]); }" 2>/dev/null || echo " Failed: $$theme"; \
done
@echo "HTML files saved to output/uploads/jsonresume-themes/"
@echo "Open in browser & print to PDF"
# Favorite JSONResume themes for PDF export
JSONRESUME_PDF_THEMES = kendall modern-plain one onepage-plus
# Generate PDFs for favorite themes using puppeteer
jsonresume-pdf: jsonresume-all-html
@mkdir -p output/uploads
@echo "Generating PDFs for favorite themes..."
@node -e " \
const puppeteer = require('puppeteer'); \
const themes = '$(JSONRESUME_PDF_THEMES)'.split(' '); \
(async () => { \
const browser = await puppeteer.launch({headless: 'new'}); \
for (const theme of themes) { \
const page = await browser.newPage(); \
await page.goto('file://$(CURDIR)/output/uploads/jsonresume-themes/russell.ballestrini.' + theme + '.html', {waitUntil: 'networkidle0'}); \
await page.pdf({path: '$(CURDIR)/output/uploads/russell.ballestrini.' + theme + '.pdf', format: 'A4'}); \
console.log(' Created: russell.ballestrini.' + theme + '.pdf'); \
await page.close(); \
} \
await browser.close(); \
})(); \
"
@echo "PDFs saved to output/uploads/"
cover-letter:
@if [ -z "$(FILE)" ]; then \
echo "Usage: make cover-letter FILE=filename-without-extension"; \
echo "Example: make cover-letter FILE=2025-11-29-runpod-principal-software-engineer-storage-systems-russell-ballestrini"; \
exit 1; \
fi
@mkdir -p output/uploads/cover-letters
@echo "Generating PDF for $(FILE)..."
@venv/bin/rst2pdf content/pages/cover-letters/$(FILE).rst --stylesheets content/pages/cover-letters/cover-letter.style -o output/uploads/cover-letters/$(FILE).pdf
@echo "PDF generated: output/uploads/cover-letters/$(FILE).pdf"
cover-letters:
@mkdir -p output/uploads/cover-letters
@for letter in content/pages/cover-letters/*.rst; do \
basename=$$(basename $$letter .rst); \
echo "Generating PDF for $$basename..."; \
venv/bin/rst2pdf $$letter --stylesheets content/pages/cover-letters/cover-letter.style -o output/uploads/cover-letters/$$basename.pdf; \
done
@echo "All cover letters generated in output/uploads/cover-letters/"
html: pygments
venv/bin/pelican content -o output -s pelicanconf.py
html:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
clean:
[ ! -d output ] || rm -rf output
[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR)
regenerate:
venv/bin/pelican -r content -o output -s pelicanconf.py
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
serve:
venv/bin/pelican -l content -o output -s pelicanconf.py
ifdef PORT
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT)
else
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
endif
serve-global:
ifdef SERVER
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b $(SERVER)
else
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b 0.0.0.0
endif
devserver:
venv/bin/pelican -lr content -o output -s pelicanconf.py
ifdef PORT
$(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT)
else
$(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
endif
publish:
venv/bin/pelican content -o output -s publishconf.py
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS)
pygments:
@echo "Generating pygments stylesheets..."
venv/bin/python -c "from pygments.formatters import HtmlFormatter; print(HtmlFormatter(style='monokai').get_style_defs('.highlight'))" > pelican-themes/pelican-svbhack/static/css/pygments-dark.css
venv/bin/python -c "from pygments.formatters import HtmlFormatter; print(HtmlFormatter(style='default').get_style_defs('.highlight'))" > pelican-themes/pelican-svbhack/static/css/pygments-light.css
@echo "Patching to remove hardcoded backgrounds..."
sed -i 's/.highlight { background: #272822; color: #f8f8f2 }/.highlight { color: #f8f8f2 }/' pelican-themes/pelican-svbhack/static/css/pygments-dark.css
sed -i 's/.highlight { background: #f8f8f8; }/.highlight { }/' pelican-themes/pelican-svbhack/static/css/pygments-light.css
@echo "Done! Pygments stylesheets generated and patched."
rst2md:
@echo "Converting RST to Markdown in output directory..."
venv/bin/python lib/rst2md.py $(OUTPUTDIR)
@echo "Done! Markdown files generated alongside RST sources."
llms:
@echo "Generating llms.txt for AI agents..."
venv/bin/python lib/generate_llms_txt.py $(OUTPUTDIR) $(SITEURL)
@echo "Done! llms.txt generated in output directory."
jsonfeed:
@echo "Generating JSON Feed..."
venv/bin/python lib/generate_jsonfeed.py $(OUTPUTDIR) $(SITEURL)
@echo "Done! JSON Feed generated at /feeds/all.json"
jsonblog:
@echo "Generating JSON Blog..."
venv/bin/python lib/generate_jsonblog.py $(OUTPUTDIR) $(SITEURL)
@echo "Done! JSON Blog generated at /blog.json"
plaintext:
@echo "Generating plain text versions..."
venv/bin/python lib/generate_plaintext.py $(OUTPUTDIR)
@echo "Done! Plain text files generated (index.txt)."
formats: rst2md plaintext jsonfeed jsonblog llms
@echo "All agent-friendly formats generated!"
TRAINING_DATA_OUT ?= $(BASEDIR)/russell.ballestrini.net.txt
training-data: ## Convert all RST posts to plain text for ML training
@echo "converting $(words $(wildcard $(INPUTDIR)/*.rst)) RST posts to plain text via pandoc..."
@> $(TRAINING_DATA_OUT)
@count=0; \
for rst in $(INPUTDIR)/*.rst; do \
pandoc -f rst -t plain --wrap=none "$$rst" >> $(TRAINING_DATA_OUT) 2>/dev/null; \
echo "" >> $(TRAINING_DATA_OUT); \
count=$$((count + 1)); \
done; \
echo "russell.ballestrini.net: $$count posts, $$(wc -l < $(TRAINING_DATA_OUT)) lines"
SITEURL ?= https://russell.ballestrini.net
.PHONY: html help clean regenerate serve serve-global devserver publish

View file

@ -6,8 +6,6 @@ This project uses Pelican (a static site generator) to produce HTML from ``.rst`
Pelican is written in Python and uses Jinja2 template engine by default.
The theme defaults to dark mode with a light mode toggle. Theme preference is saved to localStorage and persists across sessions. The dark mode toggle also passes the theme preference to embedded Remarkbox comments via the mode parameter.
Need a new blog post entry?
===============================
@ -21,95 +19,44 @@ Try running:
development
===============================
**Setup (one command does everything):**
Clone this repo, then in the ``pelican-themes`` directory clone this repo:
.. code-block:: bash
make venv
cd pelican-themes
git clone git@github.com:russellballestrini/pelican-svbhack.git
cd ..
This creates a ``venv/`` directory with Pelican, installs all dependencies, clones the theme, and configures everything automatically.
**Testing workflow (ALWAYS test before committing):**
To install this theme:
.. code-block:: bash
make clean && make html && make serve
pelican-themes -i pelican-themes/pelican-svbhack/
This builds the site and serves it at http://localhost:8000
**Available commands:**
Next clone the `pelican-plugins` repo (I use ``random_article``)
.. code-block:: bash
make venv # Setup virtual environment
make html # Build the site
make clean # Remove output directory
make serve # Serve site at localhost:8000
make devserver # Serve with auto-reload
make resume # Generate PDF resume
make formats # Generate all agent-friendly formats
git clone git@github.com:getpelican/pelican-plugins.git
agent-friendly formats
===============================
In development I use a ``make`` file to hold common build and test commands::
The blog automatically generates multiple formats optimized for AI agents & LLM consumption:
make clean && make html && make serve
**Automated format generation (run via ``make formats``):**
I also manage my resume using ``.rst`` and I use the ``rst2pdf`` tool to turn it into a ``.pdf``::
.. code-block:: bash
make clean && make html && make resume
make rst2md # Convert all RST to Markdown (index.md)
make plaintext # Generate plain text versions (index.txt)
make jsonfeed # Generate JSON Feed v1.1 (/feeds/all.json)
make jsonblog # Generate JSON Blog format (/blog.json)
make llms # Generate llms.txt for AI agent onboarding
make formats # Run all of the above
**Generated files:**
- ``/blog.json`` - Blog index with links to markdown files (jsonblog.dev format)
- ``/feeds/all.json`` - JSON Feed v1.1 alternative to Atom/RSS
- ``/llms.txt`` - AI agent onboarding documentation with API info
- ``/*/index.md`` - GitHub-flavored Markdown for every post
- ``/*/index.txt`` - Plain text (no markup) for direct LLM ingestion
**Purpose:**
These formats enable AI agents, LLMs, & automated systems to:
- Discover all posts & fetch markdown via ``content_url`` links (blog.json)
- Subscribe to updates via JSON instead of XML (feeds/all.json)
- Discover blog structure & available formats (llms.txt)
- Read posts without HTML parsing (index.txt, index.md)
**How blog.json works:**
The ``blog.json`` file uses the jsonblog.dev format & links to hosted markdown files instead of embedding content. Each post includes a ``content_url`` field pointing to ``https://russell.ballestrini.net/{slug}/index.md``. This keeps the JSON file lightweight while providing full access to all post content through standard HTTP requests.
All formats are automatically generated during CI/CD builds & kept in sync with the HTML content.
**Requirements:**
- ``pandoc`` - Needed for RST to Markdown conversion (``make rst2md``)
blah
production release process
===============================
we use Gitlab runners to build (look at .gitlab-ci.yml file) this site and Salt Stack to release the zipped artifacts.
I use Gitlab runners to build (look at .gitlab-ci.yml file) this site and Salt Stack to release the zipped artifacts.
Any web server may be used to host an HTML site. I choose nginx in production because it is known to be very fast at serving static files.
we use environment variables in my ``pelicanconf.py`` to store secrets.
I use environment variables in my ``pelicanconf.py`` to store secrets.
For example: `Remarkbox comments <https://www.remarkbox.com>`_.
---
you should check out https://uncloseai.com for machine learning on your static web pages!
now with translation services!
nice,
dude

21
cleanup.sh Normal file
View file

@ -0,0 +1,21 @@
rm -rf content/ar/
rm -rf content/bn/
rm -rf content/de/
rm -rf content/en/
rm -rf content/es/
rm -rf content/fr/
rm -rf content/hi/
rm -rf content/id/
rm -rf content/ja/
rm -rf content/ko/
rm -rf content/mr/
rm -rf content/pt/
rm -rf content/ru/
rm -rf content/sw/
rm -rf content/ta/
rm -rf content/te/
rm -rf content/tr/
rm -rf content/translation_hashes.json
rm -rf content/ur/
rm -rf content/zh-tw/
rm -rf content/zh/

View file

@ -3,7 +3,8 @@ The Barrymores stole my heart then crushed it
:date: 2010-11-30 04:37
:author: Russell Ballestrini
:tags: Opinion
:tags: Music, Opinion
:tags: Barrymores, music
:slug: the-barrymores-stole-my-heart-then-crushed-it
:status: published
:summary:
@ -52,5 +53,3 @@ still seems active and continues to hosts a few of the bands tracks.
Sorry about the bummer, but you should still give the music a listen.
.. contents::

View file

@ -2,7 +2,8 @@ four2go!: A new spin on an old classic
######################################
:date: 2010-12-31 20:33
:author: Russell Ballestrini
:tags: Project, Python
:tags: Project
:tags: four2go!, gumyum, programming, python
:slug: four2go-a-new-spin-on-an-old-classic
:status: published
:summary:
@ -98,5 +99,3 @@ yourself!
.. |four2go! logo| image:: /uploads/2010/12/four2go.png
.. |gumyum logo| image:: /uploads/2010/12/gumyumgameslogo.png
.. contents::

View file

@ -3,7 +3,8 @@ A homegrown python bread crumb module
:date: 2011-01-02 14:14
:author: Russell Ballestrini
:tags: Code, Project, Python
:tags: Code, Project
:tags: bread, code, crumb, python
:slug: a-homegrown-python-bread-crumb-module
:status: published
@ -21,5 +22,3 @@ steps </add-a-breadcrumb-subscriber-to-a-pyramid-project-using-4-simple-steps/>`
You should follow me on twitter `here <https://twitter.com/russellbal>`_
.. contents::

View file

@ -3,6 +3,7 @@ How did Stack Overflow get initial traction?
:date: 2011-01-05 02:57
:author: Russell Ballestrini
:tags: Opinion
:tags: Opinion, social network
:slug: how-did-stack-overflow-get-initial-traction
:status: published
@ -35,5 +36,3 @@ Did I miss any reasons? Feel free to comment below.
You should follow me on twitter `here <https://twitter.com/russellbal>`__
.. contents::

View file

@ -3,6 +3,7 @@ Graphic Design Powerhouse: Wacom Bamboo, Ubuntu, and MyPaint
:date: 2011-01-09 00:14
:author: Russell Ballestrini
:tags: Art
:tags: Art, Bamboo, MyPaint, Ubuntu, Wacom
:slug: graphic-design-powerhouse-wacom-bamboo-ubuntu-and-mypaint
:status: published
:summary:
@ -54,5 +55,3 @@ software!
:target: /uploads/2011/01/treeman1.png
:class: wordwrap-right
:width: 300
.. contents::

View file

@ -3,6 +3,7 @@ I just used Google to purchase Chinese food takeout for two
:date: 2011-01-10 20:03
:author: Russell Ballestrini
:tags: Guide, Opinion
:tags: Chinese, Google, hack
:slug: i-just-used-google-to-purchase-chinese-food-takeout-for-two
:status: published
:summary:
@ -43,5 +44,3 @@ You should follow me on twitter
`here <https://twitter.com/russellbal>`__.
.. |china-food| image:: /uploads/2011/01/food1.jpg
.. contents::

View file

@ -3,6 +3,7 @@ Response to L-Theanine: a 4000 Year Old Mind-Hack
:date: 2011-01-11 17:06
:author: Russell Ballestrini
:tags: Code, Greatest Hits, Opinion
:tags: code, L-Theanine, mind hack, tea
:slug: response-to-l-theanine-a-4000-year-old-mind-hack
:status: published
:summary:
@ -40,5 +41,3 @@ You should follow me on twitter `here <https://twitter.com/russellbal>`__.
.. |dream-solving| image:: /uploads/2011/01/dream.jpg
:target: /uploads/2011/01/dream.jpg
:class: wordwrap-left
.. contents::

View file

@ -2,7 +2,7 @@ virt-back: a python libvirt backup utility for kvm xen virtualbox
#################################################################
:date: 2011-03-20 11:32
:author: Russell Ballestrini
:tags: Code, DevOps, Greatest Hits, Guide, Project, Python
:tags: Code, DevOps, Greatest Hits, Guide, Project
:slug: virt-back-a-python-libvirt-backup-utility-for-kvm-xen-virtualbox
:status: published
:summary:
@ -10,6 +10,8 @@ virt-back: a python libvirt backup utility for kvm xen virtualbox
|image0|
.. contents::
**Over the weekend I wrote virt-back, a backup utility for QEMU, KVM,
XEN, or Virtualbox guests.**
@ -23,8 +25,7 @@ feel free to give suggestions or branch the source.
virt-back has been placed in the public domain and the latest version
may be downloaded here:
* `https://git.unturf.com/python/virt-back <https://git.unturf.com/python/virt-back>`_
* `https://pypi.org/project/virt-back/ <https://pypi.org/project/virt-back/>`_
* `https://bitbucket.org/russellballestrini/virt-back <https://bitbucket.org/russellballestrini/virt-back>`_
Installation
============
@ -37,7 +38,7 @@ Otherwise you may manually install virt-back
::
sudo wget https://git.unturf.com/python/virt-back/raw/branch/master/virt-back \
sudo wget https://bitbucket.org/russellballestrini/virt-back/raw/tip/virt-back \
-O /usr/local/bin/virt-back
::
@ -107,4 +108,4 @@ Restoring
.. |image0| image:: /uploads/2011/03/virt-back.png
.. contents::

View file

@ -23,5 +23,3 @@ porting ChaosTheory. You can view the finished product at
You should also give Pylowiki a try. Pylowiki has futuristic, live
preview, same page, section edit functionality.
.. contents::

View file

@ -101,5 +101,3 @@ Place the following into teamspeak's crontab:
::
@reboot /opt/teamspeak/ts3server_startscript.sh start
.. contents::

View file

@ -57,5 +57,3 @@ You should follow me on twitter
`here <https://twitter.com/russellbal>`_
.. |onion| image:: /uploads/2011/04/onion.png
.. contents::

View file

@ -81,5 +81,3 @@ When I checked my email, I had this letter from Amazon.com:
- This smells like double taxation.
- One more reason to move out of Connecticut when looking for Tech or
IT jobs.
.. contents::

View file

@ -64,5 +64,3 @@ the faulty splitter.
.. |uverse link errors| image:: /uploads/2011/06/uverse-dsl-link-errors.jpg
.. |old uverse splitter| image:: /uploads/2011/06/old-splitter.jpg
.. |new uverse splitter| image:: /uploads/2011/06/new-splitter.jpg
.. contents::

View file

@ -2,7 +2,7 @@ Google Bot Attempts to Crawl Shortest Urls First
################################################
:date: 2011-06-25 09:37
:author: Russell Ballestrini
:tags: Code, Greatest Hits, Opinion, Project, Python
:tags: Code, Greatest Hits, Opinion, Project
:slug: google-bot-attempts-to-crawl-shortest-urls-first
:status: published
:summary:
@ -46,5 +46,3 @@ means?**
.. |school.yohdah.com.graph| image:: /uploads/2011/06/school.yohdah.com_.graph_.png
:target: /uploads/2011/06/school.yohdah.com_.graph_.png
.. contents::

View file

@ -2,7 +2,7 @@ Add a Breadcrumb Subscriber to a Pyramid project using 4 simple steps
#####################################################################
:date: 2011-07-02 17:25
:author: Russell Ballestrini
:tags: Code, Guide, Python
:tags: Code, Guide
:slug: add-a-breadcrumb-subscriber-to-a-pyramid-project-using-4-simple-steps
:status: published
:summary:
@ -54,5 +54,3 @@ snippet:
% for link in request.bread.links:
${ link | n } /
% endfor
.. contents::

View file

@ -48,5 +48,3 @@ only my name was shorter... LOL
You should follow me on twitter `here <https://twitter.com/russellbal>`_
.. |image0| image:: /uploads/2011/07/80-percent-github-hack.png
.. contents::

View file

@ -2,7 +2,7 @@ The Great Gist Heist
####################
:date: 2011-08-07 02:30
:author: Russell Ballestrini
:tags: Code, Project, Python
:tags: Code, Project
:slug: the-great-gist-heist
:status: published
:summary:
@ -43,5 +43,3 @@ torrent.
At the peak of the scrape I had 14 threads running of the script, using
approximately 580Kbps (I used iftop).
.. contents::

View file

@ -54,5 +54,3 @@ Thanks for reading, you should follow me on twitter `here <https://twitter.com/r
.. |time-travelling-wizard-alchemists| image:: /uploads/2011/08/time-travelling-wizard-alchemists.jpg
:alt: time traveling wizard alchemist
.. contents::

View file

@ -108,5 +108,3 @@ commands start guest DOMs, virsh create will also register the DOM into
the hypervisor.
|
.. contents::

View file

@ -65,5 +65,3 @@ nonsensical rules and procedures.
|https://xkcd.com/936/|
.. |https://xkcd.com/936/| image:: /uploads/2011/08/password-strength.png
.. contents::

View file

@ -2,7 +2,7 @@ Python Image Grabber pig.py
###########################
:date: 2011-08-22 18:48
:author: Russell Ballestrini
:tags: Code, Guide, Project, Python
:tags: Code, Guide, Project
:slug: python-image-grabber-pig-py
:status: published
:summary:
@ -44,5 +44,3 @@ https://bitbucket.org/russellballestrini/pig/raw/tip/pig.py
.. |pig.py| image:: /uploads/2011/08/pig1-color1.png
:class: wordwrap-left
.. contents::

View file

@ -65,5 +65,3 @@ hold importance and need each other.
If you liked this article, you should follow me `here <https://plus.google.com/101342467879466559261/posts>`_
.. |Viewers vs Doers Lecture| image:: /uploads/2011/09/lecture-viewers-vs-doers.jpg
.. contents::

View file

@ -3,10 +3,12 @@ A system administrators guide to installing and maintaining multiple python envi
:date: 2011-09-08 19:28
:author: Russell Ballestrini
:tags: DevOps, Guide, Python
:tags: DevOps, Guide
:slug: a-system-administrators-guide-to-installing-and-maintaining-multiple-python-environments
:status: published
.. contents::
Some operating systems depend on a specific version of python to
function properly. For example, Yum on Redhat Enterprise Linux 5 (RHEL5)
depends on python 2.4.3. This version of python lacks support from many
@ -111,5 +113,3 @@ python site-packages directory.
Now you can run easy_install to install packages into virtpy/lib/python2.7/site-packages.
**Thanks for reading, that's all for now.**
.. contents::

View file

@ -54,5 +54,3 @@ In loom of the recent and persisting hurricane season I present a
[gallery link="file"]
.. |image0| image:: /uploads/2011/09/hacker-olive-oil-lamp.jpg
.. contents::

View file

@ -10,5 +10,3 @@ New Baby Homecoming
|image0|
.. |image0| image:: /uploads/2011/09/RJ-and-Carter.jpg
.. contents::

View file

@ -11,7 +11,11 @@ MVP (Minimal Viable Product):
The smallest version of your idea that produces value for customers.
https://www.remarkbox.com
.. linkpeek::
uri = https://www.remarkbox.com
action = link-image
size = 280x220
style = margin-left: 25px; float: right; border-radius: 8px;
Recently I have contemplated the idea of building a screen capture
service for websites. I anticipate the service would provide
@ -23,7 +27,11 @@ After floundering on my first web application,
https://four2go.gumyum.com, I'm afraid to spend lots of time and energy
on another project if I cannot earn users or customers.
https://four2go.gumyum.com
.. linkpeek::
uri = https://four2go.gumyum.com
action = link-image
size = 280x220
style = margin-right: 25px; float: left; border-radius: 8px;
I feel the market segment for this type of service would include website
directories, live portfolio generation for website designers, and
@ -33,7 +41,11 @@ look of their site over time.
As an MVP I plan to build a free live web capture application to
basically provide a "Gravatar" for website addresses.
https://linkpeek.com
.. linkpeek::
uri = https://linkpeek.com
action = link-image
size = 280x220
style = margin-left: 25px; float: right; border-radius: 8px;
**Do you think anyone would use my MVP or service?**
@ -42,5 +54,3 @@ create live web page thumbnails. We provide the API free of charge,
think of LinkPeek as Gravatar for web addresses.
Have I missed any other market segments?
.. contents::

View file

@ -9,7 +9,11 @@ LinkPeek.com web address thumbnail api alpha release
|
https://linkpeek.com
.. linkpeek::
action = link-image
uri = https://linkpeek.com
size = 140x100
style = margin-right: 25px; float: left;
The `LinkPeek <https://linkpeek.com/>`__ API had an alpha release!
@ -18,5 +22,3 @@ The `LinkPeek <https://linkpeek.com/>`__ API had an alpha release!
LinkPeek is a website screenshot service. Convert any webpage to an
image. No software, no downloading and absolutely no waiting! Unlimited
free 140 pixel thumbnails!
.. contents::

View file

@ -26,5 +26,3 @@ document type:
This doctype tag forces the broswer into standards mode which allows the pages to render properly.
Thanks!
.. contents::

View file

@ -19,5 +19,3 @@ to gather an improved representation of backlinks.
`Click here to try
now! <https://www.google.com/#sclient=psy-ab&hl=en&source=hp&q=%22school.yohdah.com%22+-site:school.yohdah.com&pbx=1&oq=%22school.yohdah.com%22+-site:school.yohdah.com&aq=f&aqi=&aql=1&gs_sm=e&gs_upl=1836l15311l0l17007l43l35l0l0l0l8l274l5507l4.23.8l35l0&bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&fp=18aa9f7b4fee5b6d&biw=1485&bih=912>`__
.. contents::

View file

@ -51,5 +51,3 @@ Call us directly by dialing:
6 am to 10 pm Pacific Time
.. |image0| image:: /uploads/2011/10/microsoft-resells-free-internet-services.png
.. contents::

View file

@ -3,6 +3,7 @@ r8168 driver issues after Ubuntu 11.10 upgrade kernel linux 3.0
:date: 2011-10-15 11:15
:author: Russell Ballestrini
:tags: Guide
:tags: guide
:slug: r8168-driver-issues-after-ubuntu-11-10-upgrade-kernel-linux-3-0
:status: published
@ -20,5 +21,3 @@ Edit *src/Makefile*:
KEXT := $(shell echo $(KVER) | sed -ne 's/^[23]\.[1-9]\..*/k/p')o-
**Now you should follow the rest of the guide.**
.. contents::

View file

@ -37,5 +37,3 @@ forever. The foliage emits a euphoric glow under the sun saturated rays.
.. |image0| image:: /uploads/2011/10/smile-guy.jpg
.. |image1| image:: /uploads/2011/10/skull.jpg
.. |image2| image:: /uploads/2011/10/wind.jpg
.. contents::

View file

@ -16,5 +16,3 @@ will not work if you have offline enabled.
#. *Enable* "Inserting images - by Kent T"
**Welcome!**
.. contents::

View file

@ -29,5 +29,3 @@ line.
| |image0|
.. |image0| image:: /uploads/2011/10/stack-vs-queue.png
.. contents::

View file

@ -48,5 +48,3 @@ boot.
.. |image0| image:: /uploads/2011/10/df_inode-year.png
.. |image1| image:: /uploads/2011/10/df_inode-day.png
.. contents::

View file

@ -20,5 +20,3 @@ But most of all I'm scared that nobody will like me. I'm scared of
failure.
**Now that I got that out of my system please check out https://linkpeek.com**
.. contents::

View file

@ -48,5 +48,3 @@ Get out there and meet people with similar interests!
**Did you like this post?**
You should checkout the first chapter of my e-book, *How-to Work From Home* titled `The Road to Remote </how-to-work-from-home-the-road-to-remote-chapter-1/>`_
.. contents::

View file

@ -2,7 +2,7 @@ How to Incorporate Custom Configuration in a Pyramid Application
################################################################
:date: 2011-11-30 22:47
:author: Russell Ballestrini
:tags: Code, Guide, Python
:tags: Code, Guide
:slug: how-to-incorporate-custom-configuration-in-a-pyramid-application
:status: published
@ -94,5 +94,3 @@ subscribers::
Now you can use ``${google_analytics_key}`` anywhere in your template.
**Thank you for reading, and feel free to leave comments**
.. contents::

View file

@ -13,5 +13,3 @@ LinkPeek.com Number One on Hacker News
| |image0|
.. |image0| image:: /uploads/2011/12/linkpeek-number-1-on-hacker-news.png
.. contents::

View file

@ -14,5 +14,3 @@ conception as you sit bewildered at your desk.
**Other names:** *Flash Meeting*, *Flash Mob Meeting*, *Flash Office
Meeting*
.. contents::

View file

@ -2,7 +2,7 @@ LinkPeek.com, webpage to image, was a by-product
################################################
:date: 2011-12-19 00:23
:author: Russell Ballestrini
:tags: LinkPeek, Opinion, Python
:tags: LinkPeek, Opinion
:slug: linkpeek-com-webpage-to-image-was-a-by-product
:status: published
@ -25,7 +25,12 @@ and come up with less combative idea.
After witnessing the Goog release of "instant previews", I knew there
was a market for a fast and reliable web screen shot service.
https://linkpeek.com
.. linkpeek::
uri = https://linkpeek.com
size = 500x240
action = link-image
title = web page screen shot service
style = float: left; border-radius: 15px; margin-right: 15px;
So I decided to bring instant previews to anyone who needed them. I
wanted to build a fast, flexible, and easy to use screenshot API. After
@ -42,5 +47,3 @@ About a week later on a whim I posted the generator to hacker news with an hones
**Remember, when faced with pivoting or killing a project, take a good
look at all possible by-products. Don't miss the hidden gem in a
project's slag!**
.. contents::

View file

@ -35,5 +35,3 @@ charged.
Always make sure to extensively test payment and sign up code. Try all
the edge cases. Try to make your software break. Don't inflict friction
on your potential customers.
.. contents::

View file

@ -26,5 +26,3 @@ Internet entities often desire to communicate securely, some reasons include:
Since then we have new DNSSEC extensions which allow for origin authentication of DNS data,
authenticated denial of existence, and data integrity.
DNSSEC does not attempt to solve availability and confidentiality.
.. contents::

View file

@ -33,5 +33,3 @@ could be compromised during the transmission of a message.
Yes, you can have integrity of a message without confidentiality. One
can take a hash or sum of the message on both sides to compare. Often we
share downloadable files and provide data integrity using md5 hash sums.
.. contents::

View file

@ -20,5 +20,3 @@ To find the number of possible mappings we take the 256 input blocks and
find it's factorial. There are 256! possible mappings.
We can view each of these mappings as a key, so this cipher has 256! keys.
.. contents::

View file

@ -2,10 +2,12 @@ Monoalphabetic Cipher and Inverse Written in Python
####################################################
:date: 2012-02-13 22:39
:author: Russell Ballestrini
:tags: Code, Security, Python
:tags: Code, Security
:slug: monoalphabetic-cipher-and-inverse-written-in-python
:status: published
.. contents::
introduction and background
===============================
@ -148,8 +150,6 @@ Here I show how to use the library:
>>> mc.encrypt_with_monoalpha('Hello all you hackers out there!', cipher)
'sXGGt SGG Nt0 HSrLXFC t0U UHXFX!'
>>> # decrypt a message with the cipher.
>>> # decrypt a message with the cipher.
>>> mc.decrypt_with_monoalpha('sXGGt SGG Nt0 HSrLXFC t0U UHXFX!', cipher)
'Hello all you hackers out there!'
.. contents::

View file

@ -2,7 +2,7 @@ Symmetric Encryption vs Public Key Encryption
#############################################
:date: 2012-02-13 17:25
:author: Russell Ballestrini
:tags: Security, Python
:tags: Security
:slug: symmetric-encryption-vs-public-key-encryption
:status: published
@ -64,5 +64,3 @@ Public/Private Keys.
If group N had 50 members, it would need to generate and maintain 100
Public/Private Keys.
.. contents::

View file

@ -2,7 +2,7 @@ Why does a Hash provide better message integrity then an Internet checksum?
###########################################################################
:date: 2012-02-13 19:19
:author: Russell Ballestrini
:tags: Code, Security, Python, Salt
:tags: Code, Security
:slug: why-does-a-hash-provide-better-message-integrity-then-an-internet-checksum
:status: published
@ -137,5 +137,3 @@ The above code would have produced the following invalid hash:
</p>
**You should follow me on twitter:** `@russellbal <https://twitter.com/russellbal>`__
.. contents::

View file

@ -2,7 +2,7 @@ Block cipher lab
################
:date: 2012-02-14 01:36
:author: Russell Ballestrini
:tags: Code, Security, Python
:tags: Code, Security
:slug: block-cipher-lab
:status: published
@ -71,5 +71,3 @@ Block cipher lab
input = "1010000010100000101000001010000010100000101000001010000010100001"
print cipher2( input )
# output: 1010000110100000101000001010000010100000101000001010000010100000
.. contents::

View file

@ -23,5 +23,3 @@ The official `@RedSox <https://twitter.com/#!/RedSox>`__ re-tweeted the image to
:target: https://russell.ballestrini.net/my-4-month-olds-15-minutes-of-fame/cutest-redsox-fan-ever/
.. |image1| image:: /uploads/2012/02/Screenshot-at-2012-02-16-172630.png
:target: https://russell.ballestrini.net/my-4-month-olds-15-minutes-of-fame/screenshot-at-2012-02-16-172630/
.. contents::

View file

@ -50,5 +50,3 @@ I'm getting faster, this was completed in 20 minutes
:alt: I drew lumpy princess from Adventure Time
.. |image5| image:: /uploads/2012/02/sad-jake.png
:alt: I drew sad Jake from Adventure Time
.. contents::

View file

@ -2,7 +2,7 @@ Zenoss or Nagios monitoring of HTTPS using client certificate authentication
############################################################################
:date: 2012-02-26 19:21
:author: Russell Ballestrini
:tags: Code, DevOps, Python
:tags: Code, DevOps
:slug: zenoss-or-nagios-monitoring-of-https-using-client-certificate-authentication
:status: published
@ -60,5 +60,3 @@ This is the python plugin I came up with:
print "HTTP Critical:", r.status, r.reason
exit( 2 )
.. contents::

View file

@ -139,5 +139,3 @@ has length of one byte. List all three fields and their lengths.
.. |image3| image:: /uploads/2012/02/wireshark-packets.png
.. |image4| image:: /uploads/2012/02/wireshark-stop-capture.png
.. |image5| image:: /uploads/2012/02/wireshark-filter.png
.. contents::

View file

@ -108,5 +108,3 @@ list!**
:target: https://russell.ballestrini.net/how-to-save-hundreds-of-dollars-on-groceries-without-clipping-coupons/6876069657_5a2f4ae487_o/
.. |image3| image:: /uploads/2012/03/6876068965_db8a5d12b2_o.jpg
:target: https://russell.ballestrini.net/how-to-save-hundreds-of-dollars-on-groceries-without-clipping-coupons/6876068965_db8a5d12b2_o/
.. contents::

View file

@ -2,7 +2,7 @@ What do you name your python virtualenv?
########################################
:date: 2012-03-07 21:42
:author: Russell Ballestrini
:tags: Opinion, Python
:tags: Opinion
:slug: what-do-you-name-your-python-virtualenv
:status: published
@ -14,5 +14,3 @@ there?
Maybe we can come to a consensus as a standard name? Please feel free to
post your virtualenv names here as a sort of poll.
.. contents::

View file

@ -17,5 +17,3 @@ As far as I can tell, I am the originator of this version of this quote.
**EDIT:** changed "originator of the quote" to "originator of this
version of this quote".
.. contents::

View file

@ -32,5 +32,3 @@ nosslsearch cname is a bad idea and solution
|
| Reference:
https://support.google.com/websearch/bin/answer.py?hl=en&answer=186669
.. contents::

View file

@ -23,5 +23,3 @@ attach disk images to guests without restarting.
| ``virsh attach-disk`` is to ``mount`` as
| ``virsh edit`` is to ``vim /etc/fstab``
.. contents::

View file

@ -38,5 +38,3 @@ Mark Zuckerburg, I just thought up the perfect T-Shirt for you:
**I just purchased Instagram for 1B and all I got was this lousy
image filter.**
.. contents::

View file

@ -68,5 +68,3 @@ learning more about my target market and customer needs.
**If you liked this post, you should follow me on twitter
`here <https://twitter.com/RussellBal>`__.**
.. contents::

View file

@ -25,5 +25,3 @@ Once mounted I was able to SCP interesting files to a safe location.
Warning, this procedure might void your warranty. If in doubt, call
support first.
.. contents::

View file

@ -36,5 +36,3 @@ have on load averages <http://www.smythies.com/~doug/network/load_average/new.ht
:target: https://russell.ballestrini.net/high-load-on-web-server-after-updating-from-ubuntu-10-04-to-ubuntu-12-04-lts/high-load-after-updating-ubuntu-from-10-04-lts-to-12-04-lts/
.. |image1| image:: /uploads/2012/05/ubuntu.12.04.swap_.year_.png
:target: https://russell.ballestrini.net/high-load-on-web-server-after-updating-from-ubuntu-10-04-to-ubuntu-12-04-lts/ubuntu-12-04-swap-year/
.. contents::

View file

@ -34,5 +34,3 @@ issues and bought myself some time, for the moment.
.. |image0| image:: /uploads/2012/06/vertical-scale-marked.png
:target: https://russell.ballestrini.net/always-attempt-to-scale-vertically-first/vertical-scale-marked/
.. contents::

View file

@ -38,5 +38,3 @@ Then I wrote a cronjob to kill hung programs:
::
* * * * * /usr/local/sbin/killprogs.sh
.. contents::

View file

@ -71,5 +71,3 @@ Dedication plays a key role to success.
.. |image0| image:: /uploads/2012/06/dedication-eye-chemical-burn.jpg
:target: /uploads/2012/06/dedication-eye-chemical-burn.jpg
.. contents::

View file

@ -2,7 +2,7 @@ miniuri parser and ago human timedelta
######################################
:date: 2012-06-29 21:30
:author: Russell Ballestrini
:tags: Code, Project, Python
:tags: Code, Project
:slug: miniuri-parser-and-ago-human-timedelta
:status: published
@ -25,5 +25,3 @@ If you want to view their source code, look here:
* `ago <https://bitbucket.org/russellballestrini/ago>`__
I hope you enjoy them.
.. contents::

View file

@ -2,7 +2,7 @@ The Pyramid community taught me the importance of test driven development
#########################################################################
:date: 2012-09-22 14:03
:author: Russell Ballestrini
:tags: Opinion, Python
:tags: Opinion
:slug: the-pyramid-community-taught-me-the-importance-of-test-driven-development
:status: published
@ -39,5 +39,3 @@ coverage and now I understand why. Tests not only help produce better
bug-free software but also act as a powerful tool when proving the
validity of a patch. I plan to devote the next couple weeks to making
test-driven-development a habit.
.. contents::

View file

@ -2,7 +2,7 @@ Explaining cache with python
############################
:date: 2012-10-02 15:22
:author: Russell Ballestrini
:tags: Code, Greatest Hits, Python
:tags: Code, Greatest Hits
:slug: explaining-cache-with-python
:status: published
@ -122,5 +122,3 @@ should be cached. I hope this helps clear things up.
|2013-03-03-explaining-cache-scaled|
.. |2013-03-03-explaining-cache-scaled| image:: /uploads/2013/03/2013-03-03-explaining-cache-scaled.png
.. contents::

View file

@ -15,5 +15,3 @@ how to drain an iPhone battery without needing passcode
Extra points if you set the camera to record (just don't record yourself
or sounds) which will fill up the iPhone capacity.
.. contents::

View file

@ -6,6 +6,9 @@ Tips for getting pull requests approved
:slug: tips-for-getting-pull-requests-approved
:status: published
.. contents::
Pull rejection sucks!
================================================
@ -130,5 +133,3 @@ everybody wins!
:target: /uploads/2012/12/ideas-blog-get-heard.xcf_.png
.. |pull-request-stay-focused.xcf| image:: /uploads/2012/12/pull-request-stay-focused.xcf_.png
:target: /uploads/2012/12/pull-request-stay-focused.xcf_.png
.. contents::

View file

@ -2,7 +2,7 @@ ago.py human readable timedelta 0.0.4 release
#############################################
:date: 2013-01-09 00:04
:author: Russell Ballestrini
:tags: Code, Python
:tags: Code
:slug: ago-py-human-readable-timedelta0-0-4-release
:status: published
@ -28,5 +28,3 @@ Change log:
We were just shy of 800 downloads on pypi for ago-0.0.3, I hope
ago-0.0.4 will perform even better!
.. contents::

View file

@ -2,7 +2,7 @@ How to overload default function arguments in python using lambda
#################################################################
:date: 2013-01-12 11:22
:author: Russell Ballestrini
:tags: Code, Greatest Hits, Guide, Python, AWS
:tags: Code, Greatest Hits, Guide
:slug: how-to-overload-default-function-arguments-in-python-using-lambda
:status: published
@ -88,5 +88,3 @@ Here is a working example to show the new lambda function h in action:
'in 12 days, 22 hours, 12 minutes from now!'
'this happened 14 days, 1 hour, 53 minutes ago!'
.. contents::

View file

@ -2,7 +2,7 @@ virt-back's Domfetcher class returns doms from libvirt API
##########################################################
:date: 2013-03-02 15:04
:author: Russell Ballestrini
:tags: Code, DevOps, Python
:tags: Code, DevOps
:slug: virt-backs-domfetcher-class-returns-doms-from-libvirt-api
:status: published
:summary:
@ -19,7 +19,7 @@ KVM <https://code.ncultra.org/2013/02/scale-11x-open-virtualization/>`__\ "
on virt-back.
During my trip home I used the in-flight wifi to push this
`commit <https://git.unturf.com/python/virt-back/commit/d6dff27323650bf784cc284f676299ffe07953cb>`__
`commit <https://bitbucket.org/russellballestrini/virt-back/commits/d6dff27323650bf784cc284f676299ffe07953cb>`__
into the cloud from the clouds! This particular commit re-factored the
dom object list generation into a simple-to-use class called Domfetcher.
Domfetcher abstracts the libvirt API and grants access to the following
@ -65,5 +65,3 @@ As always thanks for reading!
.. |2013-03-02-scale-virt-back-domfetcher-scaled| image:: /uploads/2013/03/2013-03-02-scale-virt-back-domfetcher-scaled.png
:target: /uploads/2013/03/2013-03-02-scale-virt-back-domfetcher-scaled.png
.. contents::

View file

@ -2,7 +2,7 @@ Guido name dropped tornado python tulip and pep-3156
#####################################################
:date: 2013-03-22 22:07
:author: Russell Ballestrini
:tags: Uncategorized, Python
:tags: Uncategorized
:slug: guido-name-dropped-tornado-python-tulip-and-pep-3156
:status: published
@ -34,5 +34,3 @@ multi-player browser-based-game.
.. |2013-03-22-tornado-callback-long-polling-event-loop-scaled| image:: /uploads/2013/03/2013-03-22-tornado-callback-long-polling-event-loop-scaled.png
:target: /uploads/2013/03/2013-03-22-tornado-callback-long-polling-event-loop-scaled.png
.. contents::

View file

@ -38,5 +38,3 @@ Chromium-browser cron example:
.. raw:: html
</p>
.. contents::

View file

@ -11,5 +11,3 @@ Survey Baby Monkey
|baby-monkey-fxhp|
.. |baby-monkey-fxhp| image:: /uploads/2013/04/baby-monkey-fxhp.jpg
.. contents::

View file

@ -2,7 +2,7 @@ Honey! I just DELETED LinkPeek.com
###################################
:date: 2013-05-26 13:19
:author: Russell Ballestrini
:tags: DevOps, LinkPeek, Opinion, Python
:tags: DevOps, LinkPeek, Opinion
:slug: honey-i-just-deleted-linkpeek-com
:status: published
@ -51,5 +51,3 @@ This system will allow me to:
#. test disaster recovery procedures before needing them
#. provision development and production environments without effort
#. have a reproducible blueprint of "how to build a LinkPeek server"
.. contents::

View file

@ -2,7 +2,7 @@ High load and CPU usage craftbukkit compared to vanilla minecraft
#################################################################
:date: 2013-06-20 23:35
:author: Russell Ballestrini
:tags: Opinion, Project, Salt
:tags: Opinion, Project
:slug: high-load-and-cpu-usage-craftbukkit-compared-to-vanilla-minecraft
:status: published
@ -23,5 +23,3 @@ minecraft server and started the craftbukkit minecraft server:
.. |minecraft-vs-craftbukkit| image:: /uploads/2013/06/minecraft-vs-craftbukkit.png
:target: /uploads/2013/06/minecraft-vs-craftbukkit.png
.. contents::

View file

@ -2,7 +2,7 @@ Add a custom header to all Salt managed files using pillar and jinja templates
##############################################################################
:date: 2013-07-01 14:11
:author: Russell Ballestrini
:tags: DevOps, Guide, Salt
:tags: DevOps, Guide
:slug: add-a-custom-header-to-all-salt-managed-files-using-pillar-and-jinja-templates
:status: published
@ -67,5 +67,3 @@ substitution, for example hosts/hosts:
I use this same technique to declare most configuration options as
parameters, like hostnames, IP addresses, ports, and more.
.. contents::

View file

@ -2,7 +2,7 @@ Create your own fleet of servers with Digital Ocean and salt-cloud
##################################################################
:date: 2013-07-02 22:20
:author: Russell Ballestrini
:tags: DevOps, Guide, Python, Salt
:tags: DevOps, Guide
:slug: create-your-own-fleet-of-servers-with-digital-ocean-and-salt-cloud
:status: published
@ -111,5 +111,3 @@ gain access to the following commands::
If all goes well you should have a newly provisioned server bootstrapped with salt-minion.
The new minion's keys are already added to the salt-master.
Now you just need to run highstate!
.. contents::

View file

@ -2,7 +2,7 @@ Understanding Salt Stack user and group management
##################################################
:date: 2013-07-08 13:51
:author: Russell Ballestrini
:tags: DevOps, Guide, Salt
:tags: DevOps, Guide
:slug: understanding-salt-stack-user-and-group-management
:status: published
@ -98,5 +98,3 @@ parameterize arguments:
{% endfor %}
.. contents::

View file

@ -2,7 +2,7 @@ Configuration Management vs Remote Execution
############################################
:date: 2013-07-11 23:15
:author: Russell Ballestrini
:tags: DevOps, Greatest Hits, Opinion, Python, Salt
:tags: DevOps, Greatest Hits, Opinion
:slug: configuration-management-vs-remote-execution
:status: published
:summary:
@ -72,5 +72,3 @@ changes either state or data it should be placed into the configuration
management for the reasons mentioned above.
.. |config-mangement-vs-remote-execution| image:: /uploads/2013/07/config-mangement-vs-remote-execution.png
.. contents::

View file

@ -2,7 +2,7 @@ Control a MongoDB collection in configuration management
########################################################
:date: 2013-10-14 21:39
:author: Russell Ballestrini
:tags: DevOps, Guide, Salt
:tags: DevOps, Guide
:slug: control-a-mongodb-collection-in-configuration-management
:status: published
@ -78,5 +78,3 @@ drop the collection before re-importing thus removing stale records.
We now have a version controlled JSON file in configuration management
and the power of MongoDB Document Objects in our application code!
.. contents::

View file

@ -2,7 +2,7 @@ Postfix Salt State Formula
##########################
:date: 2013-10-17 21:28
:author: Russell Ballestrini
:tags: DevOps, Guide, Salt
:tags: DevOps, Guide
:slug: postfix-salt-state-formula
:status: published
:summary:
@ -178,5 +178,3 @@ update a managed Postfix lookup table.
{% endif %}
.. |postfix-config-management| image:: /uploads/2013/10/mysza.gif
.. contents::

View file

@ -2,7 +2,7 @@ Simplify deployments with Upstart and uWSGI
###########################################
:date: 2013-10-19 22:35
:author: Russell Ballestrini
:tags: DevOps, Opinion, Python
:tags: DevOps, Opinion
:slug: simplify-deployments-with-upstart-and-uwsgi
:status: published
@ -75,5 +75,3 @@ embedded below:
The web application is now daemonized and listening on port 5200 with 4
workers. I leave implementing the Nginx front end to the reader.
.. contents::

View file

@ -90,5 +90,3 @@ Just make sure the VM doesn't currently exist on the hypervisor.
This strategy is great for complete backups of machines which could be
used during a manual migration, or if corruption happened to the VM and
we wanted to restore to a previous version.
.. contents::

View file

@ -2,7 +2,7 @@ Hackathon 2013 Virtualization
#############################
:date: 2013-12-13 20:56
:author: Russell Ballestrini
:tags: Project, Python, Salt, Docker
:tags: Project
:slug: hackathon-2013-virtualization
:status: published
@ -488,5 +488,3 @@ I would have liked to test out physical to virtual migrations
</li>
</p>
.. contents::

View file

@ -2,7 +2,7 @@ sensu-salt
###########
:date: 2013-12-17 11:35
:author: Russell Ballestrini
:tags: DevOps, Guide, Salt
:tags: DevOps, Guide
:slug: sensu-salt
:status: published
@ -86,5 +86,3 @@ Later when I was done messing with writing checks, I used the following
salt-cloud --destroy sensu-server
salt-cloud --destroy sensu-client1 sensu-client2 sensu-client3 sensu-client4
.. contents::

View file

@ -80,5 +80,3 @@ Like magic the data appended to ``input.log`` will appear in
Heka also has great docs and a number of input and output plugins, but
don't take my word for it, try it yourself!
.. contents::

View file

@ -2,7 +2,7 @@ Test Game Engine with Python and SFML
#####################################
:date: 2014-01-02 00:30
:author: Russell Ballestrini
:tags: Art, Code, Python
:tags: Art, Code
:slug: test-game-engine-with-python-and-sfml
:status: published
@ -28,5 +28,3 @@ and SFML. I plan to use this post to track my progress.
push <https://www.youtube.com/watch?v=SsAi00wv0vU>`__
- `Power ups and grow and
shrink <https://www.youtube.com/watch?v=2-FFMP67atU>`__
.. contents::

View file

@ -96,5 +96,3 @@ This machine is a test hypervisor and after reviewing the output from
``zpool iostat -v`` over the last couple days, I'm pretty sure adding
L2ARC to this box was not needed, but it was a great learning
experience.
.. contents::

View file

@ -152,5 +152,3 @@ with chassis power for more extreme measures.
I run FreeNAS on an HP DL180 G6 and just replaced my p410 controller with an LSI SAS9220-8i (IBM M1015) flashed to IT mode. The stock cables are long enough. I did not have issues with fans running at high RPM.
(I did the same replacement on an `HP DL160 G6 running SmartOS </how-i-added-two-seagate-240g-ssds-as-smartos-l2arc/>`_ and it didn't have a high fan RPM issues either)
.. contents::

Some files were not shown because too many files have changed in this diff Show more