Category Archives: In English

Setting Up the Enigma Conky Suite on Debian / MATE

A practical, step-by-step guide to installing and configuring the
rew62/enigma conky suite on a Debian-based system running MATE (or any X11 desktop).
It also covers the common “can’t open display” pitfall and
how to make the suite auto-start cleanly on every login.

What is Enigma?

Enigma is a modular conky suite for Linux desktops. Each widget is a separate
conky process that runs inside a tmux session, so you can launch, stop, and rearrange
widgets independently. Out of the box it gives you:

  • Arc (horizon, planets, sun/moon, weather)
  • Multi-month calendar and a Lua calendar (espcal)
  • Sweep ring clock and a solar dial ring
  • Combined Net/Sys/Disk widget, network traffic panel, disk I/O monitor
  • Earth satellite image viewer and a day/night world map
  • Weather forecast (NWS for the US, Met.no fallback elsewhere)
  • Now Playing with album art, spectrum EQ, and lyrics
  • Stock indices and stock ticker
  • Google Calendar month view, horoscope, and more

The repo is built and tested on Linux Mint 22.3 / Cinnamon, but it works on any
X11 desktop with conky-all 1.22.x. It needs conky compiled with Lua, Cairo, Mouse
events, ARGB visuals, Own window, Xft, and XDBE (double buffering).

1. Prerequisites

You’re going to need the following. Install them with apt:

sudo apt install -y --no-install-recommends \
    conky-all tmux fzf xdotool playerctl cava \
    imagemagick jq vnstat librsvg2-bin pulseaudio-utils \
    python3-ephem luarocks curl wget git ca-certificates \
    fonts-noto-core fonts-noto-color-emoji fonts-dejavu fonts-liberation

Quick heads-up if any package name isn’t available in your distro’s repos: the
author’s setup script also tries to install fonts-ibm-plex, which isn’t
in Debian’s default repositories. The bundled fonts shipped with the repo cover
essentially the same roles, so this is fine to skip.

Verify your conky has the required build features:

conky -v 2>&1 | grep -iE "cairo|mouse|argb|xft|own window|xdbe"

You should see Cairo, Mouse events, ARGB visual,
Own window, Xft, and XDBE all listed. If any are missing,
install the conky-all package or build conky from source with the
required flags.

2. Save your existing conky setup (if any)

If you already have a conky configuration you want to keep as a fallback, back
it up first:

BACKUP_DIR="$HOME/.conky_backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
cp -av "$HOME/.config/conky" "$BACKUP_DIR/conky_config"
cp -av "$HOME/.config/autostart/conky.desktop" "$BACKUP_DIR/" 2>/dev/null
[ -e "$HOME/.conkyrc" ] && echo "$HOME/.conkyrc -> $(readlink "$HOME/.conkyrc")" \
    > "$BACKUP_DIR/symlink_info.txt"
echo "INTERFACE=$(ls /sys/class/net | grep -v lo | head -1)" \
    > "$BACKUP_DIR/sysinfo.txt"
echo "BATTERY=$(ls /sys/class/power_supply/ | grep -iE 'BAT' | head -1)" \
    >> "$BACKUP_DIR/sysinfo.txt"

3. Clone the repository

By convention the suite lives at ~/.conky/enigma. That’s the
default lookup path baked into every widget, so leave it there unless you have a
good reason to move it.

mkdir -p ~/.conky
cd ~/.conky
git clone https://github.com/rew62/enigma.git

4. Configure the environment

Most widgets read keys and location from ~/.conky/enigma/.env. The
suite’s own enigma-config.sh will generate this file, but writing it
by hand is faster and easier to automate. The keys are:

  • OWM_API_KEY — OpenWeatherMap API key (free). Leave as
    placeholder if you’ll only use the Met.no fallback.
  • FINNHUB_API_KEY — FinnHub API key (free). Only needed for the
    stock ticker widget.
  • CITY_ID, LAT, LON — your location.
    Jakarta, Indonesia: city ID 1642911, lat/lon about
    -6.2088, 106.8456.
  • UNITSmetric or imperial.
  • INTERFACE_NAME — your network interface (e.g. wlp2s0,
    eth0). Check with ip route | grep default.
  • DISK_DEV — your disk device (e.g. sda,
    nvme0n1). Check with lsblk -dno NAME,TYPE.
cat > ~/.conky/enigma/.env <<EOF
OWM_API_KEY=replace_me_openweathermap
FINNHUB_API_KEY=replace_me_finnhub
CITY_ID=1642911
UNITS=metric
LAT=-6.2088
LON=106.8456
INTERFACE_NAME=wlp2s0
DISK_DEV=sda
EOF
chmod 600 ~/.conky/enigma/.env

5. Install the bundled fonts

The widgets reference several display fonts that aren’t in the default
repositories. The repo ships them under fonts/; install them to your
user font directory and refresh the cache:

FONT_DIR="$HOME/.local/share/fonts"
mkdir -p "$FONT_DIR"
find ~/.conky/enigma/fonts -maxdepth 2 -type f \
    \( -iname "*.ttf" -o -iname "*.otf" \) -print0 \
  | while IFS= read -r -d '' src; do
        family=$(fc-query --format='%{family}\n' "$src" 2>/dev/null | head -n1)
        if [ -n "$family" ] && fc-list | grep -qiF "$family"; then
            echo "  skipped: $(basename "$src") [$family]"
        else
            cp "$src" "$FONT_DIR/$(basename "$src")"
            echo "  installed: $(basename "$src") [$family]"
        fi
    done
fc-cache -f "$FONT_DIR"

Verify the fonts are picked up:

fc-match "Orbitron"
fc-match "Oxanium"
fc-match "Barlow Condensed"
fc-match "MonaspiceNe Nerd Font"

6. The “can’t open display” problem

When you run etmux from a remote SSH session, a non-graphical
terminal, or directly from an autostart entry, conky will fail with
can't open display:. That’s because $DISPLAY and
$XAUTHORITY aren’t set in those contexts — conky needs them to know
which X server to draw on and which credentials to use.

On a typical laptop, the user session lives on display :0 with the
authority file at ~/.Xauthority. The fix is to set these env vars
before invoking etmux:

export DISPLAY=:0
export XAUTHORITY=/home/<your-username>/.Xauthority
~/.conky/enigma/etmux

Replace <your-username> with your actual account name
(helen in this guide’s example).

7. Patching etmux for headless launches

The repository’s etmux launcher ends with
tmux attach-session -t conky, which is meant to give you a live
windowed view of every widget. That’s nice when you launch from a terminal, but
it fails when the launcher is invoked from a non-interactive context (like the
graphical autostart system) because there’s no TTY to attach to.

Patch the final line of etmux so it only attaches when a TTY is
actually available:

if [ -t 0 ]; then
    tmux attach-session -t "$SESSION"
else
    echo "Suite launched in detached tmux session '$SESSION' (no TTY for attach)."
    echo "Run './etmux' from a terminal to attach."
fi

Leave the earlier attach-session inside the goto
subcommand alone — that path needs to attach so you can navigate to a specific
widget pane.

8. A reusable launcher script

Putting the env vars and idempotency into a small launcher keeps things tidy
and makes it easy to start the suite from any terminal.

mkdir -p ~/bin
cat > ~/bin/enigma <<'EOF'
#!/bin/bash
# Launch the Enigma conky suite with the user's X session env attached.
# Idempotent: if a previous suite is already running, tear it down first.
ENV_FILE="/home/<your-username>/.conky/enigma/.env"
[ -f "$ENV_FILE" ] && set -a && . "$ENV_FILE" && set +a

if tmux has-session -t conky 2>/dev/null; then
    /home/<your-username>/.conky/enigma/etmux quit >/dev/null 2>&1
    sleep 1
fi

pkill -u "$(id -u)" -f "conky -c" 2>/dev/null
sleep 1

exec /home/<your-username>/.conky/enigma/etmux "$@"
EOF
chmod +x ~/bin/enigma

After this, from any terminal you can simply type:

enigma             # launch the default group
enigma quit        # stop everything
enigma help        # list all widgets and groups

9. Autostart on every login

The MATE desktop (and GNOME, XFCE, Cinnamon) honours XDG autostart entries in
~/.config/autostart/. Drop a .desktop file in there to
have the suite launch on every login:

cat > ~/.config/autostart/conky.desktop <<EOF
[Desktop Entry]
Type=Application
Name=Conky (Enigma)
Comment=Enigma conky suite (default group, no horoscope)
Exec=env DISPLAY=:0 XAUTHORITY=/home/<your-username>/.Xauthority /home/<your-username>/bin/enigma
Icon=conky
Terminal=false
Categories=System;Monitor;
X-GNOME-Autostart-enabled=true
Hidden=false
EOF

The env DISPLAY=:0 XAUTHORITY=... prefix is what makes this work
reliably at login time, when the desktop environment hasn’t yet propagated those
variables to the autostart child process.

10. Choosing what runs

By default etmux launches the default group, which
is 15 widgets:

c e ec ed em en es ev g m si wf wt zen zkr

Mapping those codes to widgets:

Code Widget
c Multi-month calendar
e Earth satellite image viewer
ec Lua calendar (espcal)
ed Disk I/O monitor
em Day/night world map
en Network traffic panel
es System monitor
ev vnstat bandwidth summary
g Google Calendar month view
m Now Playing (music2)
si Stock indices
wf Weather forecast strip
wt Temperature bar
zen ENIGMA logotype
zkr Killroy Was Here

Notice that the h code (horoscope) is not in the default
group. If you want even fewer widgets, or you want to add specific ones, just pass
the codes as arguments:

~/bin/enigma t c wf wt    # ring clock, calendar, weather forecast, temperature bar
~/bin/enigma stack1       # named group: a sd st r t zkr
~/bin/enigma help         # full list of codes and groups

11. Quick troubleshooting

Suite launches but nothing appears on the desktop.
Confirm the widgets can actually open the display:

DISPLAY=:0 XAUTHORITY=$HOME/.Xauthority conky -c ~/.conky/enigma/widgets/multimon.rc

If you see can't open display, the env vars aren’t reaching the
widget. Re-check the autostart entry and the ~/bin/enigma launcher.

Some widgets show “no data” or empty fields.
Most likely an .env placeholder that wasn’t filled in. The weather
widgets, world map, and sun/moon calculations all need a real
LAT/LON.

Fonts look wrong.
Confirm the bundle was installed:

fc-match "Orbitron"      # should resolve to Orbitron, not Noto Sans
fc-match "Oxanium"       # should resolve to Oxanium

If they fall back to Noto, run fc-cache -f as your user and retry.

tmux session “conky” already exists.
You tried to launch a second suite while one was already running. Either run
enigma quit first, or use the launcher in
~/bin/enigma which handles this automatically.

Widgets flicker or look low-contrast.
The bundled sample-luma.sh script tries to read the desktop
wallpaper luminance to pick a transparent or opaque theme. If it can’t reach
the wallpaper daemon (e.g. on a fresh MATE session), it defaults to transparent.
Forcing /dev/shm/conky/enigma_luma=0.0 gives a transparent look;
setting it to 1.0 gives the opaque theme. Make
/dev/shm/conky writable if you want the script to write it:

sudo mkdir -p /dev/shm/conky
sudo chmod 1777 /dev/shm/conky

Recap

  1. Install the apt dependencies; verify conky has all required build features.
  2. Back up your existing conky config if any.
  3. Clone the repo to ~/.conky/enigma.
  4. Write ~/.conky/enigma/.env with your location and API keys.
  5. Install the bundled fonts and refresh the font cache.
  6. Patch etmux so it doesn’t crash when launched without a TTY.
  7. Add a reusable ~/bin/enigma launcher that sets
    DISPLAY and XAUTHORITY.
  8. Drop a .desktop file into ~/.config/autostart/
    using that launcher.

After that, the suite starts on every login, with the default group of 15
widgets ready to go, and you can fine-tune which ones to run from any terminal
with enigma <codes...>.

How to setup NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4 on vLLM with 2x RTX 5090 – A full walkthrough of the install, the gotchas, and how to benchmark it

This article documents exactly what it took to get Nemotron-3-Nano-30B-A3B running on vLLM with 1M context, thinking mode, tool calling, and API-key auth on a 2x RTX 5090 (Blackwell, sm_120) box running Ubuntu 22.04. The model itself is a hybrid Mamba-2/MoE/Attention architecture with NVFP4 weights – one of the first production models that exercises every cutting- edge path in vLLM at once.

The article is split into:

1. The plan and feasibility math
2. The install
3. The eight things that go wrong on Blackwell + Nemotron-H + NVFP4
4. The launch script
5. Benchmarking (with real numbers)
6. Gotchas and lessons learned

1. THE PLAN

Hardware (confirmed via nvidia-smi):

2x NVIDIA GeForce RTX 5090 (32 GB each, sm_120 / Blackwell)
Driver 580.95.05, CUDA 13.0 available, 131 GB RAM, 478 GB disk free
Ubuntu 22.04.5 LTS, Python 3.10.12, no nvcc initially, port 20000 free

Model (nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4):

Architecture : NemotronHForCausalLM (hybrid Mamba-2 + MoE + 6 attn layers)
Quantization : NVFP4 (modelopt, weights ~16 GB, kv_cache_quant=fp8)
Native context : 262 144 (256k)
Hidden size : 2688
Layers : 52 (23 Mamba + 23 MoE + 6 Attention)
Attention heads : 32, KV heads = 2 (heavy GQA), head_dim = 128
MoE : 128 routed experts, 1 shared expert, top-6
Active params : ~3B (out of ~30B total)
Chat template : includes reasoning tags
Tool calling : Hermes format (chat_template.jinja ships in repo)
Gated : NO – public download, no HF token needed

Why 1M context actually fits on 32 GB GPUs:

    Only 6 of 52 layers have a KV cache. The Mamba-2 SSM is 
    recurrent with O(1) state per sequence (it does NOT 
    grow with context length), and the MoE layers have 
    no attention at all.

    KV @ 1M ctx (bf16, TP=2 replicated):
      = 2 (K+V) * 2 (KV heads) * 128 (head dim) * 2 bytes * 6 layers
      = 6.1 KB / token
      = 5.95 GB total per GPU at 1M tokens

    Add fp8 KV cache (NVIDIA pre-configured this in 
    hf_quant_config.json with kv_cache_quant_algo: FP8) 
    and we're at ~2.9 GB per GPU.

    So 1M context is comfortable; the trick is YaRN to extend 
    attention positions from the native 256k out to 1M.

2. THE INSTALL

Step 1 – Set up a Python 3.10 venv at /opt/vllm-venv:


apt-get install -y python3.10-venv
python3 -m venv /opt/vllm-venv
/opt/vllm-venv/bin/pip install --upgrade pip wheel setuptools

Step 2 – Install PyTorch + CUDA 13.0 system-wide (needed for nvcc + JIT header paths that vLLM workers look up via $CUDA_HOME):


DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
cuda-nvcc-13-0 \
cuda-cudart-dev-13-0 \
cuda-cccl-13-0 \
cuda-driver-dev-13-0 \
cuda-nvrtc-dev-13-0 \
libcusparse-dev-13-0 \
libcusparselt0-dev-cuda-13 \
libcublas-dev-13-0 \
libcurand-dev-13-0 \
libcudnn9-dev-cuda-13

Reasoning: vLLM nightly is a single abi3 wheel that bundles its own CUDA-13 Python runtime, but the worker subprocesses still spawn nvcc to JIT-compile flashinfer CUTLASS kernels for the local GPU arch.

That nvcc needs the matching dev headers; otherwise you get “fatal error: cublasLt.h: No such file or directory” deep inside a ninja build.

IMPORTANT: after this install, /usr/local/cuda is re-pointed via update-alternatives to cuda-13.0 (so compute_120 is in nvcc’s –list-gpu-arch output). If you ever install a different cuda-* package later, re-check that symlink – it’s the silent foot-gun.

Step 3 – Install vLLM nightly (stable has NO Blackwell cu128 wheel):


/opt/vllm-venv/bin/pip install --extra-index-url \
https://wheels.vllm.ai/nightly vllm

This pulls vllm-0.26.0rc1 + torch 2.11.0+cu130 + flashinfer 0.6.14 + a full CUDA-13 Python stack. The venv ends up around 11 GB.


/opt/vllm-venv/bin/pip install --quiet ninja huggingface_hub

Step 4 – Download the model:


/opt/vllm-venv/bin/hf download nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4 \
--local-dir /root/models/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4 \
--max-workers 8

~19 GB across 18 files (5 safetensors shards + chat_template.jinja + the nano_v3_reasoning_parser.py and modeling_nemotron_h.py that vLLM auto-imports via trust_remote_code-style auto_map).

Step 5 – Patch config.json to add YaRN rope scaling.

vLLM 0.26 dropped the –rope-scaling CLI flag (you set it in the model’s config.json now, or via JSON overrides baked in at serve time).

Edit /root/models/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4/config.json and add:


"rope_parameters": {
"rope_type": "yarn",
"factor": 4.0,
"original_max_position_embeddings": 262144
}

(New transformers >= 4.50 reads “rope_parameters”; “rope_scaling” still works as legacy fallback but you get a warning. Use rope_parameters.)

Also keep a backup so you can revert if you decide to stay at native 256k context:

cp config.json config.json.bak

3. THE EIGHT THINGS THAT GO WRONG (and exactly how to fix each)

If you skip straight to “vllm serve” you will hit, in order:

(1) “unrecognized arguments: –rope-scaling / –rope-theta / –swap-space” -> vLLM 0.26 removed these CLI flags. Move them into config.json (rope_parameters) and drop –swap-space entirely.

(2) “User-specified max_model_len (1056768) is greater than the derived max_model_len (max_position_embeddings=1048576.0)” -> Set max_model_len = 1048576 exactly (= 262144 * 4), not higher. If you must exceed it, export VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 (it warns about NaN risk on out-of-range rope positions).

(3) “Could not find nvcc and default cuda_home=’/usr/local/cuda’ doesn’t exist” -> Install cuda-nvcc-12-8 OR cuda-nvcc-13-0 via apt, then set PATH=/usr/local/cuda/bin:$PATH in the launch env. For Blackwell sm_120 you need nvcc 13.0 – 12.8 errors with “SM 12.x requires CUDA >= 12.9” when probing GPU archs.

(4) “FlashInfer requires GPUs with sm75 or higher” -> Deceptive error: flashinfer isn’t failing to detect the GPU, it’s failing because its TARGET_CUDA_ARCHS list is empty. Caused by nvcc –list-gpu-arch returning empty. Fixed by installing nvcc 13.0 so compute_120 shows up.

(5) “‘ninja’ not found” -> pip install ninja into the venv, and put /opt/vllm-venv/bin FIRST in PATH so the worker subprocesses inherit it.

(6) “fatal error: curand_kernel.h: No such file or directory” -> apt install libcurand-dev-13-0. flashinfer CUTLASS paths include device-side curand headers for random sampling in MoE routing.

(7) “fatal error: cublasLt.h / nvrtc.h / cusparse.h not found” -> apt install libcublas-dev-13-0, cuda-nvrtc-dev-13-0, libcusparse-dev-13-0, cuda-cccl-13-0. These are the dev-13.0 packages; -dev-13-1/-13-2/-13-3 exist too but 13-0 matches what vLLM’s bundled nvcc 13.0.88 was compiled against.

(8) “Free memory on device cuda:1 (19.67/31.36 GiB) on startup is less than desired GPU memory utilization (0.9, 28.22 GiB)” -> A previous failed vLLM run left zombie VLLM::Worker_TP0/TP1 processes holding 11 GB each. pkill -f “vllm serve” doesn’t kill them because their process name is different. Use nvidia-smi –query-compute-apps=pid,process_name then `kill -9 ` directly. You can also drop gpu-memory-utilization to 0.85 to give yourself a 5% buffer.

There’s a 9th gotcha that’s not an error but will save you 10 minutes:

(9) The model directory must contain nano_v3_reasoning_parser.py at the root. Pass –reasoning-parser-plugin /nano_v3_reasoning_parser.py AND –reasoning-parser nano_v3 on the CLI. If you use a different parser name (like deepseek_r1) the reasoning extraction silently breaks – test it by checking that response.choices[0].message has a “reasoning” field, not just “content”.

4. THE LAUNCH SCRIPT


# /root/start-nemotron.sh - launches Nemotron vLLM fully detached
set -u
VENV=/opt/vllm-venv
MODEL_DIR=/root/models/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4
API_KEY=$(cat /root/vllm-api.key)
LOG=/var/log/vllm/nemotron.log
PIDFILE=/var/run/nemotron-vllm.pid

mkdir -p /var/log/vllm /var/run
pkill -9 -f "vllm serve" 2>/dev/null || true
sleep 2

export PATH=/opt/vllm-venv/bin:/usr/local/cuda/bin:$PATH
export CUDA_HOME=/usr/local/cuda
export HF_HUB_OFFLINE=1
export TRANSFORMERS_OFFLINE=1
export NCCL_P2P_DISABLE=0
export TOKENIZERS_PARALLELISM=false
export VLLM_LOGGING_LEVEL=INFO
export VLLM_ALLOW_LONG_MAX_MODEL_LEN=1

# Generate the API key once:
# python -c "import secrets; print(secrets.token_urlsafe(32))" > /root/vllm-api.key
# chmod 600 /root/vllm-api.key

setsid bash -c "
exec $VENV/bin/vllm serve $MODEL_DIR \
--host 0.0.0.0 \
--port 20000 \
--served-model-name nemotron-nano \
--api-key $API_KEY \
--tensor-parallel-size 2 \
--max-model-len 1048576 \
--max-num-seqs 16 \
--gpu-memory-utilization 0.90 \
--enable-auto-tool-choice \
--tool-call-parser hermes \
--reasoning-parser nano_v3 \
--reasoning-parser-plugin $MODEL_DIR/nano_v3_reasoning_parser.py \
--enable-prefix-caching \
--enable-chunked-prefill \
--dtype bfloat16 \
>> $LOG 2>&1
" /dev/null 2>&1 &
echo $! > "$PIDFILE"
disown 2>/dev/null || true
echo "Launched. PID=$PID, log=$LOG"

Run it with `bash /root/start-nemotron.sh`.

First boot takes 5-10 minutes because the worker JIT-compiles flashinfer CUTLASS sm_120 kernels (a few hundred cu files, ~150 nvcc invocations).

Subsequent restarts skip the kernel cache at /root/.cache/flashinfer/0.6.14/120f/ and start in ~60s.

Watch the log for the magic line: INFO: Application startup complete.

5. BENCHMARKS

Using the OpenAI-compatible /v1/chat/completions endpoint with stream=true and stream_options.include_usage=true:

SINGLE-STREAM DECODE (512 generation tokens, varying prompt size):

    prompt  gen      TTFT    total     decode_tok/s
    -----  ----     ----    -----     ------------
      243   145    0.16s    0.77s          189.4
      927   162    0.14s    0.81s          200.7
     3658   200    0.41s    1.23s          162.5
    14580   275    0.33s    1.43s          192.5
    58270   364    0.64s    2.11s          172.7
   116524   450    8.31s   10.13s           44.4   <- prompt processing dominates

LONG GENERATION (1024 output, 24-token prompt): prompt=24 gen=1024 total=4.36s decode_tok/s=235.0

CONCURRENT (8 parallel streams, 512 gen each): total=4096 tokens wall=3.24s aggregate=1263 tok/s (about 158 tok/s per stream under 8-way concurrency)

THINKING MODE (reasoning_effort=medium, "What is 17 * 24?"): gen=529 total=2.19s decode_tok/s=241.5 -> response.choices[0].message.reasoning has the chain-of-thought -> response.choices[0].message.content has the final answer

TOOL CALL (force tool_choice=function for "weather in Tokyo?"): tool_calls[0].function.name = "get_weather" tool_calls[0].function.arguments = '{"location":"Tokyo"}' -> Hermes parser emits clean OpenAI-format tool_calls

TOOL CALL WITHOUT tool_choice: Often returns the answer in plain text. The model has the ability but chooses prose. Force it with `tool_choice` or a clear system prompt like "You MUST call the get_weather function".

These numbers are sane for a 30B-A3B NVFP4 hybrid on 2x Blackwell. For comparison, the BF16 sibling would be ~2-2.5x slower on decode (weight memory bandwidth bound) and would NOT fit on 32 GB GPUs at 1M context.

6. LESSONS LEARNED

- NemotronH is a hybrid model. 23 of 52 layers are Mamba-2 (recurrent, fixed-state), 23 are MoE (no attention), only 6 are attention. So prompt-context cost is mostly MoE weight bandwidth and a small KV cache, NOT quadratic attention.

- vLLM nightly is the only path to Blackwell + NemotronH + NVFP4 right now. PyPI stable has no cu128/cu130 wheel for Blackwell, and the NemotronHForCausalLM modelopt loader landed in late-2025.

- The launch environment matters enormously. /usr/local/cuda must point to a CUDA version whose nvcc can list compute_120. PATH must include /opt/vllm-venv/bin (for ninja) and /usr/local/cuda/bin (for nvcc). CUDA_HOME must be set. All four are needed.

- The first cold start compiles a few hundred flashinfer CUTLASS cu files. Don't panic if the log is just ninja [N/56] lines for 5-10 minutes. Look for the actual fatal error (one of the eight above) and fix it; subsequent restarts are fast.

- After a failed launch, ALWAYS nvidia-smi --query-compute-apps before restarting. The VLLM::Worker_TP0/TP1 children survive pkill -f "vllm serve" because their argv[0] is different, and they hold ~11 GB of GPU memory each. Kill them by PID.

- Reasoning output goes in a separate field. response.choices[0].message has .reasoning (chain-of-thought) AND .content (final answer). If you only see .content, your reasoning parser isn't loaded correctly.

- For 1M context attention quality, expect some degradation past the native 256k. The model was trained with rope up to 262144; YaRN with factor=4 extends it but is not free. For workloads that mostly live under 256k, you can drop YaRN entirely (just remove the rope_parameters block) and you'll get full training-quality attention.

- The serve command does NOT need --trust-remote-code. vLLM 0.26 resolves NemotronHForCausalLM natively via the auto_map entry in config.json. Modeling code lives in the model dir.

- Bind to 0.0.0.0 if you want reachability from inside the same host or via SSH tunnel. If you want public reachability, open the cloud firewall (security group / cloud firewall rule / iptables) to allow inbound TCP on 20000 from your client IPs.

APPENDIX A - Quick health check

# Is it up?
curl -sS http://localhost:20000/v1/models \
-H "Authorization: Bearer $(cat /root/vllm-api.key)"

# Quick chat test
curl -sS http://localhost:20000/v1/chat/completions \
-H "Authorization: Bearer $(cat /root/vllm-api.key)" \
-H "Content-Type: application/json" \
-d '{
"model": "nemotron-nano",
"messages": [{"role":"user","content":"In one sentence, what is the capital of France?"}],
"max_tokens": 60,
"temperature": 0
}'

# GPU usage
nvidia-smi --query-gpu=index,memory.used,memory.free,utilization.gpu --format=csv

# vLLM logs
tail -f /var/log/vllm/nemotron.log

# Restart cleanly
pkill -9 -f "vllm serve"; nvidia-smi --query-compute-apps=pid \
| awk -F, 'NR>1 {print $1}' | xargs -r kill -9
bash /root/start-nemotron.sh

APPENDIX B - File layout on disk


/opt/vllm-venv/ Python 3.10 venv, 11 GB
/root/models/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4/
config.json patched with rope_parameters
config.json.bak original (no rope scaling)
chat_template.jinja reasoning + tool-call template
nano_v3_reasoning_parser.py reasoning parser plugin
modeling_nemotron_h.py remote modeling code
configuration_nemotron_h.py remote config class
model-00001-of-00005.safetensors ~4 GB each
...
/root/vllm-api.key API key, mode 0600
/root/start-nemotron.sh launch script
/var/log/vllm/nemotron.log server log
/var/run/nemotron-vllm.pid current PID
/root/.cache/flashinfer/0.6.14/120f/ JIT-compiled CUTLASS .so's
/root/.cache/vllm/torch_compile_cache/ AOT-compiled torch graphs

End of article. Tested August 2026
on 2x RTX 5090 + vLLM nightly 0.26.0

XCTB – X Compression Tool Benchmarker

I deal with a lot of big files at work. While storage capacity is not infinite indeed. So it’s in my interest to keep the file sizes as low as possible.

One way to achieve that is by using compression. Especially when dealing with log files, or database archive, you can save a ton of space with the right compression tool.

But space saving is not the only consideration.

You also need to weighs in other factors. Such as :

  • File type : different tool will compress different type of file differently
  • CPU multi-core capabilities
  • Compression speed
  • Compression size
  • Decompression time

But there are so many great compression tools available in Unix / Linux. It can be really confusing to choose which one to use even for a seasoned expert.

So I created X Compression Tool Benchmarker to help with this.

Features :

  • Test any kind of file : just put the file’s name as the parameter when calling the script. Then it will be tested against all the specified compression tools.
  • Add more compression tool easily : just edit the compressor_list & ext_file variable, and that’s it
  • Fire and forget : just run the script, and forget it. It will run without needing any intervention
  • CSV output : ready to be opened with Libre Office / Excel, and made into graphs in seconds.

Here’s a sample result for a Database archive file (type MySQL dump) :

The bar chart on top of this article is based from this result.

As you can see, currently this script will benchmark the following compression tools automatically : pigz – gzip – bzip2 – pbzip2 – lrzip – rzip – zstd – pixz – plzip – xz

The result, for each different file types, may surprise you 🙂

For example ; I was surprised to see rzip beat lrzip – because lrzip is supposed to be the enhancement of rzip.

Then I was even more surprised to find out that :

  • I was testing Debian Buster’s version of rzip, which turned out to be pretty old – it does not even have multi-thread/core capability
  • But when I tested the latest version of rzip, which can use all the 16 cores in my server – it turned out to be slower than the old rzip from Debian Buster !
  • No, disk speed is not an issue – I made sure that all the benchmark was run from NVME SSD

So I was grinning at how Debian Buster packaged a very old version of rzip instead of the new one – turned out the joke’s on me : the old rzip perform better than the new one. Even without the multi-core capability.

Also it was amazing to see how really REALLY fast zstd is, while still giving decent compression size. When you absolutely need compression speed, this not so well known compression tool turned out to be the clear winner.

And so on, etc

Yes, indeed I had fun 🙂

I hope you will too. Enjoy !


UPDATE : My friend , Eko Juniarto, published his results here and have permitted me to publish it here as well – thanks. Very interesting, indeed.

BSA Sued by Indonesian company

I thought I’d never see the day – BSA (Business Software Alliance) is currently being sued by an Indonesian company, Multisari, due to the illegal raids carried out to find illegal / pirated software.

I know, I know – what an irony indeed, right ? 🙂 breaking the law to find the breakers of the law, gosh.
What a bunch of genius. 😀

Context : Here in Indonesia, some(often?)times there are rogue officials, from BSA or Police, who conducted the checks (raids) illegally.

Imagine having your computers / servers seized suddenly, due to suspicion of having illegal software in it.
What a nasty way to halt a company’s daily operation eh? Yet that’s what happened with a lot of companies here.

No search warrant. No warning whatsoever.
Just some officers suddenly showing up in your office, do some quick check – and there goes your computers.

However, most of the victims chose to stay silent. Or, do a backhand deal with said officers, involving some cash of course, to secure the return of their computer.

Some of the victims of these illegal BSA raids also chose to migrate to Linux 🙂 which then are welcomed warmly by the local F/OSS community.
Thanks BSA for sending them our way ! Bill Gates & Steve Ballmer would be SO happy that you did such a great job 😀

Anyway, Multisari chose to stood its ground. It chose to strike back at these BSA bullies. And I’m so happy to be able to witness such a day. Good for them !

Quoted :


“In case number 517/Pdt.G/2011/PN.Jkt.Pst, Multisari Langgeng Inc. sued BSA Singapore, BSA Indonesia, and BSA Washington DC”


“Multisari sued BSA because of the raids conducted by BSA Singapore (**) and BSA Indonesia to its office on September 22dn, 2011”

(**) What the hell is BSA Singapore doing here, raiding Indonesian companies, on Indonesian soil ?
This is an outrage.

Source : http://www.bisnis.com/articles/hukum-bisnis-perkara-multisari-vs-bsa-masuk-mediasi
(hint: Google Translate is your friend)

A Conversation With Irshad Manji

What a wonderful tool these soc-med (social media) websites are. They enable us to communicate to people far away with speed & ease never imagined before.
A few days ago I’ve had the pleasure of getting connected to Irshad Manji – a well-known activist on Islam & freedom; via Twitter.

I found her following quote :

Hadith is heresay. Ignore it. I accept that Quran is divinely inspired but even Islamic history shows that it’s been tampered with.

So I retweeted it on my Twitter account as follows :

This is the real @IrshadManjiHadith is heresay. Ignore it… Quran is divinely inspired but.. it’s been tampered withhttp://j.mp/9N2trE

It’s mostly for my own note, since my Twitter account is also recorded in my Lifestream website

To my surprise, I got the following reply from Irshad :

“@sufehmi This is the real @IrshadManji: http://bit.ly/awAoK2 How about sending it out to your tweeps? ;)”

Thanks to the link, I ended up reading a LOT of stuff on her website 🙂

It gives me a lot more information about her. Some people are angry with her for her writings & books.
I think, looking at her past and the abuse she (and her family) endured from her father – the response (eg: what she is now) is understandable.
Also I found notes & photos on her journey to Indonesia, including her visit to a madrassa. Remembering her previous quote (http://j.mp/9N2trE), I couldn’t help but wonder if the people there knew her stance on Quran & Hadits (Islam’s foundations) and if they’d still be that friendly to her. Some madrassa in Indonesia can be pretty orthodox.
Anyway, looks like the visit went without any incident, and I’m happy for it.

Of course I also read her article about Indonesia, since it’s the she send in her previous tweet.
After reading it, and finding several inaccuracies, I wrote her back :

“@IrshadManji – The article still need loads of editing 🙂 example: it’s not “islamists”, but “extremists”, etc etc :)”

Then I got the following reply :

“@sufehmi You’re an Islamist, are u? Then u choose dogma over faith. Dogma is insecure & weak, thus needing orthodoxy. Sad 4 u.”

Err…. no, that’s a wrong assumption 🙂

But it’s understandable – with Twitter’s limitation of 140 characters per post, it’s very easy to misunderstood others. And her concern is genuinely touching me.

Looks like I owe some explanation to Irshad.
So, here goes nothing :

On the term “Islamist”

I’ve been opposed to the term “Islam fundamentalist” because it gave negative perception to something that’s supposed to be done by anyone claiming to be muslims.
In my opinion, being a fundamentalist is good since :

  1. you don’t just accept what people said to you – instead, you try (struggle) to go back to the original “source”, and find out the real thing, and
  2. by utilizing the source, you can avoid later deviations / mistakes done by other people. You get the real stuff.

Instead of “fundamentalist”, we should label the troublemakers as what they really is – “extremists”. Or, “zealots”

Anyway, along with the passage of time, the use of this term started to fade away. But, then another term rose to popularity, “Islamist”

This is even worse.

Since I’m a Muslim, of course I consider myself as an “Islamist”.
But instead, these people uses this label (islamist) on the extremists.

Thus placing me, and other innocent Muslims, in the same league as those criminals.

Hopefully this explains my tweet much clearly.

On “Dogma

I used to despise dogma, and people who cling to & do it blindly.
The topic is even one of my favourite movie 🙂

I prefer to evaluate things rationally. My religion, my action, my situation, and so on.
Gradually, I’ve been able to act less emotionally, and more rationally.

I even tested it by plunging myself into various atheists / islamophobic forum 🙂
I came out badly scarred & wounded, but alive – and with stronger logic & faith than ever. It was an experience that I shall cherish until the end of my time.

However, I began to realize that not everyone is capable of such thing. This is a fact.

Especially in Indonesia – where even in the secular schools we are taught rote learning.
We’re taught to memorize, not to understand. So naturally, most of the product of Indonesian education system is not capable of critical thinking.

It’s a sad realization. But it’s also a fact.
I’ve witnessed these people firsthand — when you gave them information to analyze, they went berserk / became very confused instead. Their brain is simply not yet capable of doing so. They became bewildered, and ended up very frustrated. It’s a very sad view.

That’s when I began to be able to appreciate dogma.

The enlightened ones formulate various dogma for the others. Others then can live their life happily, spared from the mental anguish of having to analyze information beyond their capability.

Of course this is not an ideal situation. The enlightened ones (or “ulama”, etc) then have the responsibility to enlighten others too.
So along the time, less and less people will need to rely on dogma. They’ll be able to find out & walk on their own path.

Now here comes the problem.
Many of the so-called ulama are actually bad people. They act like the enlightened ones – spoke ambiguously, acting high & mighty, and so on. But, they are actually some of the worst people on earth.

I’ve seen many of these so-called ulama actually contradicted Islam’s teachings. In several cases – quite spectacularly too.
However, they managed to keep their charade, and fool a lot of people. This is one of many problems found on various Muslim communities.

Anyway, that’s my view on Dogma. Hope it made some sense.

On things that needs fixing in Islam

My faith is that the foundation of Islam, Quran & Hadith, is sound and good.
Especially when we saw how it was implemented in the time of Muhammad — it transformed the barbaric Arabs into one of the most civilized tribe on Earth, in very little time.
If you know the Arabs, you’ll be able to appreciate this too.

A lot of things needs to be fixed in current implementation of Islam. Make no mistake.
But it’s mostly our own faulty interpretation & implementation. The foundations are still sound.

So it baffles me when people ignore the problems, and rattled the foundations instead. It made no sense to me.

Yet people continue to do similar mistakes, such as :

  1. If you see wrong tafseer / interpretation of Islam – you fix it. Don’t change the Quran instead.
  2. If you see the believer making mistake – you blame him. Don’t blame the religion instead.

And so on, the list of mistakes went on.
It would be hilarious to see so-called intellectuals making these logical-fallacies, if it’s not sad.

Focus & Fix the problems, people.
Don’t waste your time trying to find fault on things which you already knew to be faultless – otherwise you’ll end up deluding yourself.

Epilogue

So far that’s the end of my conversation with Irshad Manji. I’ll update this blog post if it continues later on.

Talk @ WordcampID 2010 : High Performance WordPress : done quick, cheap, and easy

Untuk para pembaca setia dari Indonesia : Silahkan klik tombol Google Translate di atas artikel ini.
Terimakasih 🙂

Last year I was contacted by Valent Mustamin, whom I started to be acquainted with by Twitter. He asked me if I’d be interested to speak in WordcampID 2010. My response was “HELL YES!” – well, ok, not exactly like that 🙂 but, you get the idea.

Before we continue, I must say it was very nice of him to get in touch with me quite that far in advance. Usually, sometimes, I was called and asked, “hey, how about speaking in this seminar which, by the way, is gonna be held tomorrow?”. Ouch. Sometimes I have problems booking a date even for the next week.
With WordcampID 2010, I was able to prepare the material well, and also booked the date of the event (30 January 2010) before I got other appointments. Zero conflict. Peace on earth.

Back to the topic – I proposed to speak about “High Performance WordPress”, which, of course, discusses ways to speed up WordPress. My talk will adhere to 3 main criterias : easy, cheap, faster.
Easy : it’s easy to do, kinda drop-in solution which you can do in 15 minutes flat.
Cheap : it’s not gonna cost you the arm & the leg. Basically, a dedicated server (dual core, 2 GB RAM) will suffice. It’s not some kind of highly complex, multiple-servers setup.
Faster : it will speed up your WordPress installations by multiple times AND will increase its capacity as well – capability to serve multiple concurrent visitors at the same time.

This solution is aimed to the websites in “growing-pains” period : too big for shared webhosting, but still too small in revenue to afford multiple-servers infrastructure.
In my experience, these websites usually are ranked between 10000 to 100000 in Alexa.

With the solution presented, I hope to be able to help these websites to grow their traffic significantly, and finally move up to the elite leagues with no problem.

You may ask, why another discussion on this topic? Isn’t this already discussed in many blog postings everywhere?

Indeed, however, soon I spotted a problem. When I was helping my friend, Mr Romi, to speed up his WordPress-based website, the highly popular IlmuKomputer.com, I noticed that the tutorials on this topic are :

(1) Suggests the hardest way with the least gain – first, and/or
(2) Only works for lesser websites (eg: Alexa rank > 200.000), and/or
(3) Potentially will your website to become buggy / to lose data, and/or
(4) It may cost you your first unborn child, and your arm, and your legs, and/or
(5) Did I mention that the methods are sometimes pretty hard to do ?, and/or
(6) Oh, did I already mention that it sometimes only offer 25% performance gain ?

The method I discussed can give 100000% performance gain. With 15 minutes of work.
And with very minimal messing (only normal config changes) with current installation of Apache/PHP/MySQL.

In a server, I tested its LAMP (Linux – Apache – MySQL – PHP) stack performance, and I got 2 requests / second.
After I finished optimizing it, I got 2000 requests / second. No kidding.

I know that in the audience there are several people from webhosting companies, who can get financial gain from this. Not just poor webmasters having problems with their ever-popular websites. But I don’t care. I love to share knowledge, and I believe only good things will come out from sharing them.
So there 😀

Anyway, enough rambling – on to the goodies !

[ High Performance WordPress – OpenOffice format ]
[ High Performance WordPress – PDF format ]
[ High Performance WordPress – Flash format ]

Note: The slides here have been updated with the excellent suggestion from Simon Lim regarding DNS.

Also, at the moment I’m working on another solution which is as easy, but offers even MUCH faster performance gain. Stay tuned.
Enjoy ! 🙂

LG : Life is Good – But We (our website) Sucks

Today I had a chance to practice my patience. I failed 🙂 lg-sucks

It all started when we realized that we have lost the User Guide / Owner’s Manual for our LG Jet Cool Air Conditioner. Model LS-Q076.
While we still don’t know how to program the AC to shut off at certain time.

We need this functionality to ensure that the kids will still have an enjoyable night sleep – but without suffering from dry air due to a continuous, all-night, AC operation.

So, easy, right? Nowadays, just Google, and you should find it, right. Right ? 🙂

Finding LG’s website was easy enough. However, I immediately realized that the WHOLE website’s interface was coded in Javascript.

This is a nightmare for visitors like me for various reasons :

(1) Broken “back” button
(2) Slower website performance
(3) In case of problems – it’s back to start for us.

The International LG website has 4000+ documents listed for their AC product alone. So I looked for its Indonesian website. Found it in no time. And the horror begin.

The website is slow. Horribly slow. This is on a 3G broadband connection, with regular 160 Kbps download speed.

It’s the dynamic parts – the static parts of the website renders quickly. However, its dynamic ones, such as lists, will show up MUCH later.

Basing the website heavily on Javascript doesn’t help either in this particular case. Now you have 2 dynamic parts – on server and client. Both horribly unoptimized.

By default, a dynamic website WILL perform slower than a similar, static one. There are tricks to make it faster, but you need to be really knowledgeable in this topic to pull it off.
LG’s website not only deploy dynamic website on both of its server & client side; it also does so blindly.

Actually, I still have patience for this kind of websites. Since they’re so widespread anyway, sometimes you just have to grind your teeth and get on with it.

But broken navigation ? That’s the last straw.

Basically, I was browsing on the braindead UI design of LG’s website, when it threw an error on me.
I call it braindead because you are looking for a single document from a THOUSAND available choice – but you can only see 20 choices at a time; and you can NOT skip to the page where you think your document is.

Then after skippng about 40 pages, you found the document – and it threw an error.

I had to start again from the Front page 🙁

No, the BACK button does NOT work. Genius, I know.

So, after hours of browsing, retries, and barely enough patience to held back my rage; I finally got my document. Yeah!
Now we know how to set the AC off after certain time.

Then I rushes to my blog, and wrote this. 🙂

Anyway, hope you enjoyed reading it, more than I have suffered it. These kind of websites should be named & shamed as widely as possible.
Hopefully then we’ll be seeing less of them. And the Internets then will become a MUCH better place to browse around.

To Hell with stupid web design practices ! 😀

Mobile Dev Joy : The Adventure with Mobile Browser

My post today will be rather technical, but I’m sure some will find it interesting because it’s about a topic that’s not as widely discussed as others. Some may even find it useful. It’s about my brief stunt with mobile development.

Some time ago I was asked to look at a web-based apps which is to be used with a mobile phone. A Nokia E70 to be exact. It’s based on Symbian S60 3rd edition platform. Basically, a Javascript which is supposed to run won’t. So I looked into it.

This piece of Javascript is vital for usability reasons. Without it, the input process will take up to 50% longer. So I thought, yeah I’ll set aside a bit of my time and hack this.

Then I realized that when I thought the browser situation on the PC / desktop platform is a mess; it actually look very tidy and well-ordered compared to the situation on the mobile platform 🙂

First, mobile platform is much more limited — in terms of CPU / processor power, memory capacity, secondary storage (hard disk / flash ram) capacity, power, etc. These limitations in turn must be taken into account by all mobile browsers. Which causes various quirks / incompatibilities to surface when you dig deeper into it.

Second, free(dom) software has not yet made as much impact here as it is on the desktop. Therefore we have plethora of proprietary technologies, which sometimes doesn’t work together / conform to the open standards.

Third, there’s not as many documentations available on the topic. As I googled around, I realized in horror that I may have to hack around much more than I thought necessary.

Back to the hack – first thing I tried was to install Opera mobile (not Opera mini). Yes, we’re willing very willing to pay Opera if it works. In short – the Javascript works on it.
Unfortunately, Opera mobile crashes around so much, it’s impossible to enjoy any kind of productivity with it.

Also there are a LOT of quirks with Opera mobile when used with keypad.
They are small things, but gets annoying very quickly. Which doesn’t help when you’re trying to accomplish good amount of work.

Maybe it’d be better if I try an older version of it, but seeing it consume too much RAM anyway; I thought I’ll give the built-in browser a try first.

Called “Nokia Mini Map Browser” because of its “mini map” feature, it’s speedier than Opera mobile and doesn’t use as much memory. However, the Javascript on our web-apps doesn’t work there.

So I thought, perhaps this browser doesn’t support the latest version of Javascript. Or worse, perhaps it has its own version of Javascript. That would suck greatly.
Anyway, I started to try looking for documentation on the topic, also for a tool to help me debug the problems there.

I found Nokia Mobile Browser Simulator 4.0. It’s Java-based. However, it seems to be hard-coded for Windows, with Windows installer too. Ok so I found a Windows machine, and set it up.

To my dismay, it doesn’t work very reliably. To be precise, it won’t even load the web-apps. While the actual browser in Nokia E70 will display it correctly.

With documentation on the subject (Javascript capabilities of Nokia Mini Map Browser) also very lacking, this is starting to look like a dead end.
Until I found out that the Nokia Mini Map Browser is actually an open source project !

Code named “S60browser”, or “S60Webkit”, it’s available from opensource.nokia.com
There’s hope – if there’s code available, then anything can always be traced / found out.

My sharp-minded readers will quickly realize another thing – yes, it’s basically the same as the Safari browser, the one on Mac OS X 🙂

Nokia Mini Map Browser aka S60browser aka S60Webkit is based on another open source project called WebKit. Which happens to be the foundation used as well by Apple to build their browser, Safari.

Now this is getting interesting 🙂

I dug deeper into these new clues, and began to feel sure that both browser’s cores are indeed identical. Which means that I’d be able to debug the problem with Safari browser.

safari-pref-advanced
I fired up Safari, invoked the Preferences screen, and clicked on Advanced icon. I enabled “Show Develop menu in menu bar”, then I restarted Safari. A new menu then showed up. I chose Develop – Show Web Inspector (also accessible via Cmd-Alt-i)

I got the detailed error message in no time. It’s “Object [object HTMLInputElement] (result of expression document.getElementById(“testForm”).submit) does not allow calls“.
As I already mentioned, the script works on Firefox and Opera, but somehow it doesn’t work on Safari. So it’s Googling time again.

Turn out it’s a generic error message whenever Safari have problems executing a function.
So it could be that the function doesn’t exist. Or the function name is mispelled. Or any other function-calling related problems.
Great, looks like this will cause more questions than it answers…

Thankfully I wasn’t on the wild goose chase for too long. A comment on a blog post gave me the hint I needed :

I gave a form button the *same name* as the function it was calling in its onclick. This error was the result.

Joshua, thank you. That’s exactly what happened in my case 🙂
A line in the script is as follows :

document.getElementById(“testForm”).submit();

While there’s also a button on the same script named, you guessed it, submit :

<input type=”submit” name=submit />

So Safari got confused, and threw this generic error message.

And it’s very easy to fix, I just need to change the button’s name value to something else – and it works now on Safari & Nokia Mini Map Browser, as well as on Firefox and Opera.

I love happy endings 🙂

Moral of the story ? Open source software empowers developers.

And this is not the first time – my MSc thesis was about to fail; when I found ping’s source code on the Internet. It gave me the hint needed to continue the project. The thesis got among the best mark at that year.

With availability of the source, we can learn from the brightest minds on Earth with ease. The knowledge and wisdom become available for all.
Even to the ones with feeble minds, like me.

Here’s another cheer for free(dom) software movement : May the source be with you 🙂

(oh, and also, all hail Google !)

Google Killer ? Wolfram Alpha etc

These past few days I’ve been stumbling on articles about Wolfram Alpha. How that it’d be the next search engine. How it’d be the Google killer. And so on.
Unfortunately, it’s not the first time I’ve heard about such claims.

I can’t remember exactly when I was first online on the Internet. Probably 1995. Back at that time, there was only a handful of websites. There was a book claiming to be the Yellow Page of Internet. It was enough to get me around.

Then the internet grew. Very quickly. So I started to utilize Yahoo to find websites of interest. At that time, Yahoo looks like DMOZ.org. Yes, seriously.
Anyway, it was enough for my needs.

But the Internet doesn’t stop growing. Then I realized that I’ll need a different kind of assistance, to enable me to continue utilize it as best as possible.

So I found AltaVista. Lycos. And others. A.k.a “search engines”

It was truly amazing. You can find what you’re looking for from several millions of pages on the Internet within several seconds. Totally unheard of. I became adept at utilizing it. People thought I’m an IT wizard. While actually I was just rather good at asking the right questions to Altavista.

One thing about the Internet is that it’s a free place. Everyone can do anything at anytime. Altavista was not left alone for long — soon others are gunning for its position.

Long story cut short – Yahoo made Google as its search engine, Google became successful, Yahoo cut the deal; but it was too late. Google already became the King of Search Engines.

So now others are gunning Google.
And they’re not always doing it exactly the same way as Google. Which is good.

We’ve heard about Mahalo. About Cuil. Metacrawler, Ask.com, etc.
However, after years, still none managed to unseat Google from its top position. Despite the fact that some are answering questions even better than Google.

For example, do you know that there are search engines that can process questions in natural language form ? Example : Who is the president of Indonesia ?

Awesome 🙂

START is the first web-based answering system, online since Dec 1993. Yes, what Wolfram Alpha trying to achieve is already done by MIT. 15 years ago.
That made START even more impressive.

Have a look around : Who is Sarah Connor ?

It can be biased too 🙂
What is the best programming language ?

It can even lie !
Are you alive ?

Ahem. Okay, back to the topic – with all these wonderful engines, why it’s Google that’s still on the top ?

It’s because performance alone doesn’t ensure success.

You need also :

(1) Marketing : Google is already a very well-known brand. It’s even included in Merriam-Webster dictionary.

Competing with such well-known brand is a significant challenge.

(2) Scalability : Incoming : Can the engine scale to today’s billions of pages out there on the Internet ?

Google could. Not all the others fare as well.

(3) Scalability : Outgoing : Keeping point 2 above in mind – can you reply to people’s questions within / under 1 second ?

Google could. Some others could too – by sacrificing point 2.

(4) Relevancy : Can you read people’s mind ? Oops, let me rephrase that – can you give relevant answers to the questions ?

This is not easy as it might be because Internet keeps changing. It’s a moving target.

A while ago I was using a search engine called GigaBlast.
It was pretty good, and at the time it was even faster than Google.

However, after a while it started giving me irrelevant results. When I checked, it was because of various SEO techniques being deployed. So it got tricked in certain queries.
But Google kept becoming better. So I went back to Google.

Any contender for Google’s seat must be able to compete in the long run. They must not stay the same, because Google is always becoming better.

Yeah, it might be a while before we saw someone killed Google. Actually, they may be absorbed into Google’s collective instead.

But just as two-person start-up managed to shook the search engine world several years ago by creating Google, we may very well witness that again in the next several years. Because on the Internet, nothing is sacred and forever.

Obama : support & assist – don’t bring him down

Let’s be clear about one thing – Obama is not perfect. Anyone thinking the reverse is deluded. He’s just a man, not an angel (although it’d be really cool if he IS indeed a black angel) 🙂

So he made mistakes, and he will continue to do so from time to time.

That said – I’m absolutely appalled at lack of patience that’s displayed by some people. Do you SERIOUSLY think that 8 YEARS of destructions done by Bush can be reversed by Obama in 1 MONTH ??

Come on people. We’re talking about some of the MOST thorough global destruction ever witnessed in this century. Bush does not only destroy America, he also wreaked havoc in various other countries too. Including Indonesia – various evil US corporations really did have a field day during his administration.

I already expected that Bush’s great momentum of disaster would be really hard to stop and turn  around. I’ve suspected that Obama would have to compromise in several cases – and it has started to happen. There is NO way he’d be able to do everything – he’ll have to prioritize. Anyone with the slightest experience of management roles will understand this. To compromise really sucks, but sometimes the other options are even worse. Like quitting what you’re doing. Ask yourself – do you really feel like seeing him leaving after just a while ?

What really matters is his intentions – does Obama do that because he’s evil? Or is it because he’s cornered to? Or unable to do the reverse? And so on.

Remember, we’re talking about politics here. This is among the MOST complicated subject anyone could ever encounter. And here Obama is tackling US of A’s politics – probably the most complex of them all.

Unfortunately, we can’t read into people’s mind yet. Fortunately, we CAN make intelligent assessments. Instead of just accusing people blindly, we should really do this.

Check Obama’s track records. List his negative and positive points, this will enable you to see things more objectively. Try to focus on the bigger picture.

This is why I like Truth-O-Meter by Politifact.com. It really help you to look at things objectively, not subjectively. Note that it still misses some, even big ones – such as the fact that Obama have put a good man in charge for the recovery of USA, etc.
However, it’s definitely better than nothing.

Even easier is to compare Obama with Bush.

It then become as clear as day and night !

People, help Obama to make USA better for you. Don’t drag him down over small details. When he made mistakes – let him know that you’re not happy. When he try to do something right, let him know too that you support him.

It can be very lonely up there. If all you’re doing is nag him and get angry, any human is bound to get tired of it and think, “why the hell am I doing this ?“. That’s the first step to seduction by the sweet melody from the dark side.

A small compliment from time to time never hurts. A polite, but firm, reminder is always much better than a rude one.

.
.
.
So unless you want another Bush to rise and kick your collective a$$es even harder than before – get up, and work together to rebuild America.

We will all benefit from that as well. Because we all live in this same small blue rock called “Earth”, on this vast void of universe.

With love from Indonesia.

Chickenstrip

This has been my favorite comic strip for quite awhile now 🙂

The name itself already got me – Chickenstrip. Pure hilarity. Also it’s among my favorite food 🙂
Then the comic itself, it can be both clever & funny at the same time – without trying too hard at it.

Some of the strips are locally/Indonesian-themed, but this is a minority. Most should be enjoyable by anyone who have been in touch with IT in some way.

Now if you’ll excuse me, I gotta do my chicken dance now 😀

Spread the word ! Let’s make more people know about this brilliant comicstrip.

CDN vs Dedicated servers : cutting through the hypes

Several days ago I was having problems with my web infrastructure. It seems that it got overloaded. Traffic-wise, it should not; because (1) I got a caching reverse-proxy (squid) installed, and (2) 3 terabytes of traffic is still very well within its current capacity.

Of course, other factors may change this equation, for example, when you have database-intensive pages. In this case, even several requests per minute may already be enough to overload your servers.

Anyway, I notified the parties affected by this and started the troubleshooting process. Following the usual process of benchmarking, profiling, and optimization (BPO); soon I got all fingers pointing to squid. So tried several others, varnish, nginx, ncache; all failed – but this is for another post. This post is about hype and how even IT experts fell for it.

When doing the BPO process, I got in chat with several friends which are quite well-known as IT experts. Help is always welcome, so I followed through the discussions. The suggestions were rather strange though, but all was still well. Until one suggested me to move my infrastructure to a CDN (Content Delivery Network).

I almost snorted coffee through my nose 😀
(I really should have it by IV drips to prevent this from happening again in the future, but anyway…)

A bit about CDN – it’s basically a network of servers all over the world, which hosts the same set of data. Then when a visitor requested the file, it will be served from the server closest to its location. So the visitor will be able to fetch the data with maximum speed.

That’s basically how a CDN works. There are variations, but this is the basic of it.

The problem with using CDN :

(1) CDN is for static contents : Facebook users probably have seen their browser’s status page showing lines such as “Loading static.ak.fbcdn.net”. That’s Facebook’s own CDN. Notice the first word at the beginning of the domain name? Yup, static.

There’s a reason why CDNs are for static contents. Static contents are easier to synchronize and deliver through the whole network. You can, indeed, synch and deliver dynamic contents through a CDN — but the level of complexity jumped by several magnitude at the instant. And so is the cost. Which brings us to the second reason,

(2) Cost : standard CDN will cost you at least 5x of your normal bandwidth costs.
SoftLayer.com brought a breakthrough in this case, where their CDN costs “only” twice the normal bandwidth.

However, it’s still 200% more expensive, and my web infrastructure hosts dynamic contents, which may change by the minute — so it’s absolutely out of the question.

If that friend is willing to foot the cost, then I’m willing to play with the CDN. It makes things more fun with none of the pain 🙂

Anyway, I’m still amazed at how even IT experts fell for hypes. I know CDN sounds cool & hip & sophisticated and so on, still, personally I prefer hard proof. Especially by proving any claim by myself.

But each to its own I guess. Just try not to misled others by spreading the hype too, okay?
Repeat after me – CDN is NOT a silver bullet. And as we all knew already, applying the wrong solution to a problem will just cause even more problems.

Regarding my problem, I solved it by moving squid’s cache to a different disk. Looks like the previous disk was defective. Including some further tweaks, the performance now almost doubled compared to before the trouble begun. Some of the websites fully loads in as little as 2 seconds. Not bad.

Performance-wise, it’s now alright. But my work still continue to further expand the capacity of my web infrastructure. For now, the customers are happy.

That’s what matters.

Happy Eid – Eid Mubarak – Selamat Hari Raya Idul Fitri 1429H

This year I sent an Eid Greetings via SMS to some of my friends. That’s it – I F you can read it 🙂

I suspect it’d be rather easy to some of you, however please feel free to ask here if you have no idea what to do with that SMS. I’ll be happy to help.

Anyway, for the visitors of this blog – Let’s go retro this time, shall we ?

Eid Mubarak, may we all succeed in our struggle & quest to become a better & successful person, Amin !

Credits to http://www.ascii-art.de for the great ASCII Art.

9/11 : Authorized by George W. Bush

For years I’ve been reading the 2 extremes of the story : those who hypes it up and use it as the reason to kill other innocent people (hi Bush !), and those who claim it as conspiracy theory.

However, the second camp (conspiracy theorists) sometimes are using crazy assumptions and other invalid methods to support their claim.
Some are rational and have pretty good proofs to support their claims – but unfortunately, many others are just plain crazy.

But it may seem that it will indeed be proven as a conspiracy, headed by none other than the President of the USA himself.

As claimed by Stanley Hilton :

“This (9/11) was all planned. This was a government-ordered operation. Bush personally signed the order. He personally authorized the attacks. He is guilty of treason and mass murder.”

Stanley Hilton is no nobody. Here’s who he is :

Stanley Hilton was a senior advisor to Sen Bob Dole (R) and has personally known Rumsfeld and Wolfowitz for decades. This courageous man has risked his professional reputation, and possibly his life, to get this information out to people.

The summary of his claim : Bush ordered 9/11. We have the proofs. We have eye-witnesses :

SH: Our case is alleging that Bush and his puppets Rice and Cheney and Mueller and Rumsfeld and so forth, Tenet, were all involved not only in aiding and abetting and allowing 9/11 to happen but in actually ordering it to happen. Bush personally ordered it to happen. We have some very incriminating documents as well as eye-witnesses, that Bush personally ordered this event to happen in order to gain political advantage, to pursue a bogus political agenda on behalf of the neocons and their deluded thinking in the Middle East.

I also wanted to point out that, just quickly, I went to school with some of these neocons. At the University of Chicago, in the late 60s with Wolfowitz and Feith and several of the others and so I know these people personally. And we used to talk about this stuff all of the time. And I did my senior thesis on this very subject – how to turn the U.S. into a presidential dictatorship by manufacturing a bogus Pearl Harbor event. So, technically this has been in the planning at least 35 years.

And he’s backing it up with lawsuit worth US$ 7 billion :

We are suing them under the Constitution for violating Americans’ rights, as well as under the federal Fraudulent Claims Act, for presenting a fraudulent claim to Congress to justify the bogus Iraq boondoggle war, for political gains. And also, under the RICO statute, under the Racketeering Corrupt Organization Act, for being a corrupt entity.

Yeah, we are suing Bush, Condoleezza Rice, Cheney, Rumsfeld, Mueller, etc. for complicity in personally not only allowing 9/11 to happen but in ordering it. The hijackers we retained and we had a witness who is married to one of them. The hijackers were U.S. undercover agents. They were double agents, paid by the FBI and the CIA to spy on Arab groups in this country. They were controlled. Their landlord was an FBI informant in San Diego and other places. And this was a direct, covert operation ordered, personally ordered by George W. Bush. Personally ordered. We have incriminating evidence, documents as well as witnesses, to this effect. It’s not just incompetence – in spite of the fact that he is incompetent. The fact is he personally ordered this, knew about it. He, at one point, there were rehearsals of this. The reason why he appeared to be uninterested and nonchalant on September 11th – when those videos showed that Andrew Card whispered in his ear the [garbled] words about this he listened to kids reading the pet goat story, is that he thought this was another rehearsal. These people had dress-rehearsed this many times.

in return he & his team is being personally harassed :

And I’ve been harassed personally by the chief judge of the federal court who is instructing me personally to drop this suit, threatened to kick me off the court, after 30 years on the court. I’ve been harassed by the FBI. My staff has been harassed and threatened. My office has been broken into and this is the kind of government we are dealing with.

First of all, my office was burglarized in San Francisco several months ago. Files were gone through and some files were seized – particularly the ones dealing with the lady that was married to one of the hijackers. Fortunately, I had spare copies in a hidden place so nothing disappeared permanently. But more significantly, FBI agents have been harassing one of my staff members and threatening them with vague but frightening threats of indicting them. And it’s just total harassment. They have planted a spy, an undercover agent, in my organization, as we just recently discovered. In other words, these are Nazi Germany tactics. This is the kind of government you have in this country. This is what Bush is all about.

About loss of privacy in USA following 9/11 :

Every corrupt and criminal government has done this – they suppress their own people: Nazi Germany, Communist Russia, Mao Tse-Tung, that’s why we have the Patriot Act. So it’s hand in hand. They had it planned to go right up to September 11th, this was all part of the plan. You have to do it. It was part of my senior thesis. You must follow through the terrorists attacks with a political suppression mechanism in the law. And that’s why they want Patriot I and Patriot II and their plans are to continue launching more terrorist attacks to justify even more repression.

Unfortunately, he lost the lawsuit.
However, the story doesn’t end there – the lawsuit was lost NOT because of lack of evidence. But it was because :

the judge reasoned that U.S. Citizens do not have the right to hold a sitting President accountable for anything, even if the charges include premeditated mass murder and premeditated acts of high treason

How nice it is to become the US president – free, unlimited “out of jail” pass !
Complete immunity to do as one pleases.

No wonder US gov’t is such a wreck today, and it’s wrecking havoc with others all over the world in daily basis.

Anyway, what Stanley started is now being picked up by JusticeFor911.org – a coalition pushing for formal investigations on unresolved 9/11 questions, such as :

  1. Why were standard operating procedures for dealing with hijacked airliners not followed that day?
  2. Why were the extensive missile batteries and air defenses reportedly deployed around the Pentagon not activated during the attack?
  3. Why did the Secret Service allow Bush to complete his elementary school visit, apparently unconcerned about his safety or that of the schoolchildren?
  4. Why hasn’t a single person been fired, penalized, or reprimanded for the gross incompetence we witnessed that day?
  5. Why haven’t authorities in the U.S. and abroad published the results of multiple investigations into trading that strongly suggested
    foreknowledge of specific details of the 9/11 attacks, resulting in tens of millions of dollars of traceable gains?
  6. Why has Sibel Edmonds, a former FBI translator who claims to have knowledge of advance warnings, been publicly silenced with a gag order requested by Attorney General Ashcroft and granted by a Bush-appointed judge?
  7. How could Flight 77, which reportedly hit the Pentagon, have flown back towards Washington D.C. for 40 minutes without being detected by the FAA’s radar or the even superior radar possessed by the US military?
  8. How were the FBI and CIA able to release the names and photos of the alleged hijackers within hours, as well as to visit houses, restaurants, and flight schools they were known to frequent?
  9. What happened to the over 20 documented warnings given our government by 14 foreign intelligence agencies or heads of state?
  10. Why did the Bush administration cover up the fact that the head of the Pakistani intelligence agency was in Washington the week of 9/11 and reportedly had $100,000 wired to Mohamed Atta, considered the ringleader of the hijackers?
  11. Why did the 911 Commission fail to address most of the questions posed by the families of the victims, in addition to almost all of the questions posed here?
  12. Why was Philip Zelikow chosen to be the Executive Director of the ostensibly independent 911 Commission although he had co-authored a book with Condoleezza Rice?

More questions and details on those are available on 9/11 Independent Committee‘s website.

Here’s hoping that the truth will be uncovered soon.

Bonus : Unusual Option Market Activity and the Terrorist Attacks of September 11, 2001

Published on The Journal of Business, 2006, vol. 79, no. 4

Quoted:

After September 11, 2001, there was a great deal of speculation that the terrorists or their associates had traded in the option market on advanced knowledge of the impending attacks. This paper generates systematic information about option market activity that can be used to assess the option trading that precedes any event of interest. Examination of the option trading leading up to September 11 reveals that there was an unusually high level of put buying. This finding is consistent with informed investors having traded options in advance of the attacks.

Obama & Oprah : President & Vice President

Below is a reply to a message that I sent to Obama’s campaign a few days ago.

Basically I was suggesting that Obama pick Oprah Winfrey as his vice president.

I think Obama & Oprah would make a formidable team, and will bring good things for all of us.
Not just to American people, but potentially to many others in this world.

Let’s hear it for Obama & Oprah ! 😀

Dear Harry,

Thank you for contacting Obama for America. The volume of messages we’re receiving has gone up since Barack’s victory in Iowa. While we cannot respond individually to over a thousand messages per day, the level of interest and thoughtfulness of the comments reflected in these communications are very gratifying. Your thoughts on our campaign and America’s future are greatly appreciated.

Individual citizens like you are the foundation of this campaign.
……
Thank you again for writing.

Sincerely,

The Correspondence Team
Obama for America

Back Links DOT com : how I teased Google – and its reply

About 3 months ago I found out about Back Links dot com (let’s call it BLDC from now on). Seems like another TextLinkAds site, which can get you banned by Google. However, after closer inspection, seems like BLDC is more “invisible” than those other backlinks marketplace.

Basically its script is PHP script. So it’ll be harder to detect, unlike the Javascript ones. Well, theoritically.
Anyway, although it’d be harder to detect, it’s also harder to install for newbies. To my surprise, the support team of BLDC is very responsive. They are even willing to install the script for you on your website. This kind of service is not easy to find. And they treat everyone the same; even when I tried to obtain support for lower-pageranked websites.

So I thought, let’s see if Google can detect this on my blog 🙂
It’d be cool if Google actually able to detect it as well. Therefore I installed it in this blog’s footer. You may have noticed it (or not, it was at the bottom of the page anyway)

To my surprise; more than 2 months passed, Google didn’t do anything, and the links are selling like hotcakes. Amazing.
It’s literally easy money – you do nothing, yet you kept on getting emails almost everyday telling that another link has been sold.
I thought it’s safe now to conclude that BLDC is, well, safe.

I was proven wrong very quickly. In a routine check days later, I found out that this blog got its pagerank dropped to zero.
None. Null 🙂

To make sure it’s not a fluke (sometimes this happens when Google is updating its datacenters around the world), I waited for several days, and kept checking.
It only confirmed it. The zero rank status stays.

Panic attack ! 😀
Just kidding… I don’t really care about this blog’s pagerank anyway, that’s why I did this experiment in the first place. My curiosity got the better of me, he he

Now is the ultimate test – I deleted the BLDC code from my site. If it’s the culprit, Google would soon lifted the ban.
And, to my surprise, it happened. Just in about 3 days, this blog got its previous pagerank back.

So, I think it’s safe to conclude that Google is able to detect even BLDC, and punishes those who are selling (and most likely buying) on it as well.

I don’t know how Google accomplish it though.
I have Google analytics installed, but it should not be able to detect BLDC’s php script. Another possibility is that a Google employee created an account at BLDC, and monitor the sellers there. At first I thought this is not feasible, but with BLDC’s < 100K rank in Alexa, it may very well is worth someone's time at Google to do so. Any other ideas ? So as always, don't sell backlinks. Google has always prohibited this, and WILL make you pay :) I've confirmed it personally in this little experiment. Enjoy.

Intel selling US$ 200 laptop in Indonesia + Free Windows

This is huge news – in several mass media there are announcements that Intel has just signed the MoU with Indonesian government to sell Rp 1 trillion (approx US$ 100 million) worth of their Netbook @ US$ 200 each.

Craig Barrett @ Indonesian school

That means about 500 thousands of those.

Intel has delivered several hundreds, samples I guess (correction: donation), to several schools in Jakarta.

All of them will be running Windows XP, which was donated by Microsoft.

In the photo is Craig Barrett along with Intel Indonesia’s top brass, in a school where they have donated the Netbook (aka Classmate PC). (photo credit: Sindo.com)

Moral of the story ?
It IS possible to build truly low-cost laptops ***glares at Asus*** 🙂

More details (in Indonesian) : detikinet.com, Sindo.com

Gmail : The Spam Killer

To the right is a screenshot of one of my Gmail account.

gmail the spam killer

Amazing, 580 inbox email, and 145,000+ SPAM ! 😀

This amount of spam was used to be handled by my server. Now it happily forward them to Gmail, which then will filter the spam with its powerful spam filter.

I remember when my customers are complaining about slow Internet access. My first question is whether they hosted their email servers internally. When they answered yes, I did a quick check, then asked them to either host the mailserver externally, or use Google Apps email service.
Usually they will instantly enjoy a significant speed boost to their Internet access.

There are simply too much spam nowadays for our puny bandwidth to handle. I know of big companies here in Indonesia with only 256 Kbps internet access, shared with their 300 employees (yay). And they’re paying US$ 1400 / month (you read it right) for that…

Thankfully, Gmail comes to the rescue.
Thank you Google !

QKLK – Microsoft vs Low-cost computers, OpenOffice online

It’s back – there were visitors on this blog that loves the QKLK (quicklinks) posts. I have not been doing it for sometime (my bad), but with so many findings to share, I’ve decided to resurrect this category again.

Enjoy :


Microsoft killing the low-cost computer/laptop ?

Despite plan to stop selling Windows XP on 30 June 2008, Microsoft changed its mind and made exception for ULPC (ultra low-cost PC). It will continue to make Windows XP Home Edition for this machines.

Problem is, this really is a crippled-down version of XP. Current limitations for XP deployed on ULPCs :

1. Max screen 10.2 inch
2. No touchscreen
3. Max 1 GHz processor speed
4. Max 1 GB RAM
5. Max 80 GB hard disk

These may be a show stopper for various potential customer. May not so today, but on 2009 & 2010, this may well be.

Anyway, there’s always Linux for those who find these too limiting.


OpenOffice.org Online

OpenOffice.org now can be used to access online documents at Google Docs & Zoho.com by using the OoGdocsIntegrator plugin.

This is great, I’ve been using Google Docs & Zoho.com myself, and OOo integration is one thing missing. Now we can enjoy it too.


Bonus: McAfee missed again

I’ve been avoiding McAfee (and Symantec / Norton products) for years now. They used to create the best products on their field. Now I couldn’t find anything good on their catalog. Their products are bloated, slow, misses their target, messes up with your computer, and many other potential problems.

This screenshot is another reminder for me to stay clear from McAfee.

Google.com marked as malicious website ? Don’t they have QA team there ? 🙂

Obama: the honest, Hillary: the thief

Obama proved (among others) that you can be ethical **and** be successful. A member of Dailykos (Borell) tried to donate to Obama, but got his donation politely refused because he’s a member of a (even just non-profit) lobbying organization.

The Obama Campaign will refuse money from donator who’s linked in anyway to a lobbying organization. This fact should be highlighted MUCH more often, because the lobbyist are among the reasons that America (and the world) is in such a state of wreck today.

Among the powerful (and destructive) lobbyist are AIPAC (siphoning US taxpayers money to Israel, causing worldwide unrest), lobbyist for various energy companies (who in turn causes destructions all over the world), and many others.

The Hillary Clinton campaign, in reverse, will accept any donation, and will even steal them. Borell’s wife tried to cancel her automatic debit donation, but it’s still taken from her after these months.
Along with Hillary’s other dishonesties (sniper fire anyone?), I won’t be voting her if I’m an American.

Need more people like Obama in the governments. Here’s one rooting for you, Obama !