Compare commits
4 commits
master
...
self-brand
| Author | SHA1 | Date | |
|---|---|---|---|
| 139190dc33 | |||
| a08068ddad | |||
| 2d90a57659 | |||
| 6c0c67ad10 |
291 changed files with 442 additions and 9548 deletions
18
.gitignore
vendored
18
.gitignore
vendored
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"'
|
||||
|
|
|
|||
|
|
@ -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"'
|
||||
|
|
|
|||
|
|
@ -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
347
CLAUDE.md
|
|
@ -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
227
Makefile
|
|
@ -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
|
||||
|
|
|
|||
81
README.rst
81
README.rst
|
|
@ -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
21
cleanup.sh
Normal 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/
|
||||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -101,5 +101,3 @@ Place the following into teamspeak's crontab:
|
|||
::
|
||||
|
||||
@reboot /opt/teamspeak/ts3server_startscript.sh start
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -57,5 +57,3 @@ You should follow me on twitter
|
|||
`here <https://twitter.com/russellbal>`_
|
||||
|
||||
.. |onion| image:: /uploads/2011/04/onion.png
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -108,5 +108,3 @@ commands start guest DOMs, virsh create will also register the DOM into
|
|||
the hypervisor.
|
||||
|
||||
|
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -65,5 +65,3 @@ nonsensical rules and procedures.
|
|||
|https://xkcd.com/936/|
|
||||
|
||||
.. |https://xkcd.com/936/| image:: /uploads/2011/08/password-strength.png
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -10,5 +10,3 @@ New Baby Homecoming
|
|||
|image0|
|
||||
|
||||
.. |image0| image:: /uploads/2011/09/RJ-and-Carter.jpg
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -26,5 +26,3 @@ document type:
|
|||
This doctype tag forces the broswer into standards mode which allows the pages to render properly.
|
||||
|
||||
Thanks!
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -16,5 +16,3 @@ will not work if you have offline enabled.
|
|||
#. *Enable* "Inserting images - by Kent T"
|
||||
|
||||
**Welcome!**
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -29,5 +29,3 @@ line.
|
|||
| |image0|
|
||||
|
||||
.. |image0| image:: /uploads/2011/10/stack-vs-queue.png
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -48,5 +48,3 @@ boot.
|
|||
|
||||
.. |image0| image:: /uploads/2011/10/df_inode-year.png
|
||||
.. |image1| image:: /uploads/2011/10/df_inode-day.png
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -14,5 +14,3 @@ conception as you sit bewildered at your desk.
|
|||
|
||||
**Other names:** *Flash Meeting*, *Flash Mob Meeting*, *Flash Office
|
||||
Meeting*
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -38,5 +38,3 @@ Then I wrote a cronjob to kill hung programs:
|
|||
::
|
||||
|
||||
* * * * * /usr/local/sbin/killprogs.sh
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -38,5 +38,3 @@ Chromium-browser cron example:
|
|||
.. raw:: html
|
||||
|
||||
</p>
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -11,5 +11,3 @@ Survey Baby Monkey
|
|||
|baby-monkey-fxhp|
|
||||
|
||||
.. |baby-monkey-fxhp| image:: /uploads/2013/04/baby-monkey-fxhp.jpg
|
||||
|
||||
.. contents::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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::
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue