Reviews
A scattering of reviews. I only bother when I either really like something or really hate it.
Grammar Tools in Emacs
Up till now the only prose checker/linter I’ve used in Emacs is jinx. It’s an amazing spell checker for programmers and technical writers: it handles snake_case
and CamelCase
symbols, knows what to spell-check based on the text’s face, etc. Unfortunately, it’s just a spell checker and won’t catch any grammatical errors.
Now I’m looking for a local (offline) grammar checker. Something to catch stupid mistakes: repeat words, cut off sentences, tense disagreements, homonyms, etc. I tend to jump around a lot when writing and want a tool that’ll tell me when I started a sentence in one tense and finished it in another, or failed to finish it entirely. Ideally the tool would also provide general writing advice — wording improvements, etc. — but I’ll probably need a full language model for that.
Vale
I first tried Vale because it’s by far the simplest option and has great support for markup languages and can even lint prose within source code. To be honest, it looks like a great choice for teams that want custom rule-based prose linting. Its primary power is the expressivity of its rules allowing organizations to set and enforce writing standards (e.g., “don’t start a sentence with ‘but’”). Unfortunately, it’s not a general-purpose grammar checker, and I’m not trying to conform to some specific set of writing stylistic rules.
However, if that’s what you want, vale has great Emacs integration via flymake-vale. I say great because (a) it uses flymake (no language server setup required) and (b) only checks changed text making it very fast and lightweight.
Harper
Next I tried Harper. Like Vale, it’s mostly rule-based. However, it’s more focused on providing general-purpose writing tips than on enforcing specific stylistic rules: it can catch repeat words and tell me when a sentence is too long; it has some very basic grammar rules and can catch article/noun disagreements (a/an); it even has some rules to catch “it’s” versus “its”. I hate it.
- Harper thinks “given its computed value” should be “given it’s computed value”.
- Harper won’t catch errors like “Go to a the park.”
- Harper likes to harp on “mistakes” like “long” sentences.
Harper is like that middle-school english teacher with their highly rigid rules about writing: great for teaching good habits to the notice writer but, at this point, I’ve ingrained them. When I break these rules, it’s (usually) because I meant to break them.
What I need is a tool to help me catch stupid errors and/or a tool to help improve the flow of my writing. Harper is not that tool.
Worse, the only Emacs integration I found was harper-ls
, a language server. In Emacs specifically, this has a few downsides:
- Eglot (the default language server package in Emacs) only supports a single language server per buffer, so I can’t use Harper along with some other language server.
- Eglot expects Language Servers to be used in “projects” and will enumerate all project files when it starts the language server. Starting a language server in my home directory takes forever as it tries to enumerate all my files (including my backup snapshots…).
- Eglot will start one language server per project (in this case, often per directory).
However, if you really want to use Harper, you can trick Eglot into treating all documents (with the same major mode) managed by harper as if they were in the same project. If you don’t care, skip to the next section.
First you’ll need to define a new project type for harper. In my case, I “root” the project in a guaranteed empty directory.
(cl-defmethod project-root ((project (eql harper)))
"/var/empty")
(cl-defmethod project-name ((project (eql harper)))
"harper")
This virtual “harper” project contains all files managed by the harper language server. Honestly, it’s probably OK to simply return nil
here.
(cl-defmethod project-files ((project (eql harper)))
(when-let* ((server (cl-find-if #'eglot--languageId
(gethash (eglot--current-project)
eglot--servers-by-project))))
(mapcar #'buffer-file-name (eglot--managed-buffers server))))
Finally, add a project “finder” function that puts all buffers that would be managed by harper into the “harper” project, if and only if we’re acting on behalf of Eglot (eglot-lsp-context
is non-nil).
(defun project-try-harper (dir)
(and eglot-lsp-context
(string= (cadr (eglot--lookup-mode major-mode)) "harper-ls")
'harper))
(add-to-list 'project-find-functions #'project-try-harper)
LanguageTool
Finally, I broke down and set up LanguageTool: it’s by far the most advanced free-software grammar tool. The next step-up is Grammarly and/or LanguageTool’s online offering, but I absolutely refuse to use a remote grammar tool (I’m not sending all my notes, etc. to someone else’s server).
Unfortunately, it’s definitely a heavyweight. It uses at least 2.5GiB of memory, and you’ll need the 14GiB n-gram database if you really want it to do its job. On the other hand, it’s leagues beyond Harper and Vale in terms of catching grammatical mistakes.
In terms of Emacs integration, I ended up creating a fork of flymake-languagetool
that has improved performance (avoids re-checking the entire document on change); excludes markup, code, etc. before sending text to LanguageTool instead of filtering errors afterward for improved accuracy/performance; and renders diagnostics in the correct location even when Emoji are present in the buffer. I considered using a language server, but I had enough of that with Harper.
I recommend you find a good LanguageTool docker container or something because setting it up from scratch isn’t a fun exercise. However, if you’re like me and (a) use Arch Linux and (b) avoid sketchy docker containers, read on.
On Arch, I installed the languagetool
package from the extra repository (pick jre21-openjdk-headless
when prompted), along with a few AUR packages: languagetool-ngrams-en
, fasttext
, and fasttext-langid-models
. The fasttext packages are only used for language detection so they should be optional, but LanguageTool’s HTTP server complains if they’re not installed.
Next, you’ll need to create a configuration file to tell LanguageTool where to find everything:
fasttextModel=/usr/share/fasttext/lid.176.bin
fasttextBinary=/usr/bin/fasttext
languageModel=/usr/share/ngrams
You’ll need to pass --config /path/to/my/config.properties
to the languagetool
command (which you can configure via flymake-languagetool-server-command
and flymake-languagetool-server-args
:
(setopt flymake-languagetool-server-command "languagetool"
flymake-languagetool-server-args
'("--http" "--allow-origin" "*"
"--config" "/path/to/my/config.properties"))
That’ll get you a basic functioning LanguageTool server.
Humanity Icon for Caffeine
Caveat lector: I wrote this post in high school; it’s likely outdated and poorly written.
For those who don’t know, Caffeine is a small program for Linux that lets a user prevent his or her computer from entering a power save state. If a user wishes, he or she can even configure caffeine to automatically inhibit power-saving when watching a flash movie, or running VLC, Totem etc. For more information, visit its website here.
As a user of both Caffeine and the new Humanity icon theme (the default icon theme in karmic), I made a very basic gray-scale version of the Caffeine icon. You can download it here.
Grdc - A very good graphical VNC viewer for the average linux user
Caveat lector: I wrote this post in high school; it’s likely outdated and poorly written.
Overview
After finding myself frustrated with Vinagre’s (GNOME’s standard VNC viewer) lack of ssh tunneling support I began looking for an alternative. I finally found it: Grdc.
Grdc supports both VNC and RDP. Grdc can tunnel both connections over ssh for security. The ssh tunneling supports key based or password based authentication and allows the user to select a custom server and port (if they differ from the defaults).
Grdc’s user interface is much simpler than that of Vinagre. It allows the user to create and save custom connections and organize them by groups. Its connection quality settings are, unlike many remote desktop programs, quite simple. The user simply chooses the quality and the number of colors. Grdc also has a panel applet for the gnome-panel that lets users connect to their saved connections through a simple menu.
Another interesting feature is the “VNC Incoming Connection” protocol. This protocol lets users create new VNC servers with custom ports and passwords on the fly. This is especially useful if a user wants to let a remote user temporarily control their desktop.
Grdc does not support everything. It does not support tabbed connections like Vinagre but, in my opinion, tabbed connections are overkill for most users. It also does not support browsing a network for VNC connections with avahi as Vinagre does. This feature would be useful for administrators but is somewhat useless for the average user because most users will access the computer from the internet, not the LAN, and thus avahi support would be pointless.
Overall, Grdc is good for remote, internet traversing connections because of its ssh support and is useful to the average user because of its simplicity. Vinagre is still a better VNC client for administrators that have to manage many computers over a LAN because, on a LAN, encryption is usually unnecessary while avahi support is helpful and, when managing multiple computers, tabs are very helpful.
For screenshots see the SourceForge Screenshot Page
Installation
As of the writing of this post, the version of Grdc in the ubuntu repositories is woefully out of date and does not support ssh tunneling. Therefore one should use the deb provided by the project maintainers on sourceforge. Simply download the grdc deb (link below) and install (usually just double click). The grdc-gnome package is the gnome-panel applet and the grdc package is the main program.
Downloads: http://sourceforge.net/project/showfiles.php?group_id=248852
Homepage: http://grdc.sourceforge.net/
– Edit: I have packaged a 64bit version. Download here.
– Edit 2: The 64bit version of grdc-gnome (the panel applet) for karmic seems to work in jaunty. Download here.
Linux + Razer Lycosa = WTF
Caveat lector: I wrote this post in high school; it’s likely outdated and poorly written.
I broke my previous keyboard and went shopping for a new one (FYI: water + G15 == not good). I wanted another back-lit keyboard (like my previous G15). When I went to Best Buy (not my favorite store) I saw the slick Raser Lycosa Keyboard I decided to try it. My advice: don’t. While the keyboard itself is great (I like the low, rubber covered keys) the neither the the USB port nor the headphone jack worked on either of the keyboards that I tried (I returned the first one and tried the second one in the store). The problem: Interference. My computer refused to mount my USB flash drive while plugged into the Lycosa and the headphones buzzed (like a radio). I ended up getting the latest (annoyingly orange) G15 keyboard which works but I HATE ORANGE.
Qalculate: The best calculator program
Caveat lector: I wrote this post in high school; it’s likely outdated and poorly written.
I finaly found the (almost) perfect calculator program, qalculate. It can solve/factor equations, work with significant figures, work with trigonometry, and much more.
Screenshots:
Rarcrack: Crack zip, rar, and 7z files
Caveat lector: I wrote this post in high school; it’s likely outdated and poorly written.
I have just tested rarcrack and love it. Rarcrack cracks password protected rar, 7z, and zip archives. Sadly, it’s not in the Ubuntu repository. I have therefor compiled a deb: rarcrack.deb. I have not included this deb in my PPA because I compiled it with debianpackagemaker.
For advertisement free browsing: apply Adblock Plus
Caveat lector: I wrote this post in high school; it’s likely outdated and poorly written.
Adblock Plus is a great Firefox extension that blocks advertisements. Advertisements hog bandwidth and are distracting. It is easy to use (right click and select block element).
Here is my adblock plus filter list (save it as a text document and import it).
(Adblock Plus 0.7 or higher required) [Adblock]
@@netstream
@@http://www.microsoft.com/
@@http://www.windowsmarketplace.com/
@@|http://www.kiisfm.com/
@@|http://www.apple.com/
@@|https://www.windwardschool.org/
@@|http://iwonderdesigns.com/
@@|http://news.bbc.co.uk/
@@|http://wow.weather.com/
@@|http://www.defensedevices.com/
@@http://www2.gawker.com/assets/minify.php?files=*
@@http://syndication.mmismm.com/
@@http://tags.gawker.com/
*.2o7.net/*
*/shopping_deals*
*/tacoda/*
*_fromoursponsors_*
/(\W|_)(ad(s)?(vert(is(ement|ing|er)?)?)?)(s)?(view|log|image(s)?|Links|counter|serve(r)?|sys|brite|sonar|lengend|side|files)?(\W|_|1)/
/[\W_](blog|get|online)ad(s)?[\W_]/
/[\W_](double|fast)click[\W_]/
/\.geocities.com/js_source/(ygNSLib9|pu5geo).js/
/\D(728|588|468|234|160|120)x(600?|90)\D/
http://*.sageanalyst.net/*
http://*.centrport.net/*
http://*.falkag.net/*
http://*.industrybrains.com/*
http://*.itnation.com/*
http://*.questionmarket.com/*
http://*.spinbox.net/*
http://*.tiser.com.*/
http://*.tribalfusion.com/*
http://*.valueclick.com/*
http://*theglobeandmail.com/adsv3/*
http://ehg*.hitbox.com/*
http://graphics8.nytimes.com/marketing/
http://images.pcworld.com/shared/graphics/bevel_*.gif
http://images.stardock.com/store/*
http://images.usatoday.com/kk/classified/*
http://infospace.abcnews.com/*/adinsert.js
http://media.nyadmcncserve*.com/
http://media.washingtonpost.com/wp-srv/popjs/popup*
http://msnbc.msn.com/#DIV(p2)
http://msnbc.msn.com/#DIV(textSmallGrey)
http://msnbc.msn.com/*#DIV(clr)
http://msnbc.msn.com/*#DIV(w779)
http://pagead2.googlesyndication.com/*
http://rcm.amazon.com/e/cm?t=*
http://servedby.*
http://server.*.liveperson.net/*
http://www.goodsforyou.com/*
http://www.humaxusa.com/*
http://www.insanely-great.com/*/adsb.cgi*
http://www.kiisfm.com/cc-common/CCAS_media/ccas_creative_81152.gif
/.*(-|_|/)promo(-|_).*\.(gif|png|jpg)/
http://www.qksrv.net/*
intellitxt
*/promotions/*
http://us.a1.yimg.com/*
http://download-search.search.com/search?v=og&q=*
http://i.d.com.com/*/*_sponsors_*.gif
http://www.ftjcfx.com/*
|http://*.addfreestats.com/*
/http://feeds\.(\w|\W)+\.com/~[a]/(\w|\W)+\?.=(\w|\W)+/
http://*.casalemedia.com/*
http://www.lduhtrp.net/*
http://www.afcyhf.com/*
http://www.shareasale.com/*
http://3ps.go.com/DynamicAd?*
/[\W|_](((p|P)romo)(tional)?)?(_)?(promo(s)?|banner)(s)?(_)?(up|down|standard|right|left|top|bottom)?([0-9])?\.(gif|png|jpg|bmp)/
http://*.atwola.com/*
http://ccas.clearchannel.com/*&affiliate=*
http://network.business.com/*
http://affiliates.digitalriver.com/*
http://clk.atdmt.com/*
http://www.awltovhc.com/image-*
http://*.adland.ru/*
http://www.macdailynews.com/adpeeps/*
http://rss.sourceforge.net/~a/*
http://cgi.insecure.org/cgi-bin/pro/*
http://affiliates.babylon.com/*
http://view.atdmt.com/*
/.*(_|/)sponsor(s)?((\.(gif|jpg|png))|(/))/
http://bs.serving-sys.com/BurstingPipe/BannerSource.asp?*
*/web_banners/*
*/bin/ad
http://*.google.com/pagead/*
*/images/banner*.png
http://s1.amazon.com/exec/varzea/tipbox/*
*_sweeps*
http://www.conduit.com/banners/*
*adpartner*
http://digg.com/img/feature-*.gif
http://*.freesoftwaremagazine.com/openads/*
http://regmedia.co.uk/*
http://www.siteground.com/img/banners_cust/2*
http://ubuntulinuxhelp.com/hic300250.gif
http://www.tqlkg.com/*
http://groups.google.com/groups/adfetch?*
http://banner.casinotropez.com/*
http://www.speedsuccess.net/*
#*(sponsored_links_article)
#*(ad_bottom)
#*(ad_top)
#*(launchpad-ads-3)
#*(sponsorship)
#*(sponsorshiphack)
#*(promo2)
#*(ad_300)
#*(ad_180)
#*(adbannerblock)
#*(ad34)
#*(googlesyndication)
##div.banner ad + *
google.com#TABLE(cellpadding=9)(border=0)
openssh.com#BLINK
google.com#a(href^=https://www.google.com/ads)
babelfish.yahoo.com#DIV(ovt)
cnet.com#DIV(class=asl_margin)
cnet.com#DIV(class=rb_pft_ad)
#DIV(id=spons_links)
#DIV(class=columnGroup advertisementColumnGroup)
#A(href^=http://www.servage.net/?coupon=)
flickr.com#DIV(id=AdBlock)
youtube.com#DIV(id=leaderboardAd)
google.com#TD(rowspan=5)
google.com##TD[onmouseover="return ss()"]
google.com#H2(class=sl f)
#DIV(class=sponsor)
youtube.com#NOSCRIPT(class=noscript-show)
google.com#DIV(id=tpa1)
linuxforums.org#DIV(id=topbanner)
linuxforums.org#NOSCRIPT(class=noscript-show)
linuxquestions.org#NOSCRIPT(class=noscript-show)
#DIV(id=rightad)
#DIV(id=topad)(class=ad)
#A(class=sponsoredlink)
#DIV(id=ad-top)
#DIV(class=banner ad)
opendns.com#UL(class=adkeywords)
google.com##TABLE.contentitem[cellspacing="0"][cellpadding="5"][border="0"][bgcolor="#ffffff"][style]
google.com##TD[nowrap][onmouseover="return true"]
google.com#*(href^=http://www.google.com/sponsoredlinks?)
builtwith.com#DIV(class=featuredTechnology)
flashlinux.org.uk#DIV(id=portlet-dtm)
#*(id=sponsors)
#DIV(id=ads)
techcrunch.com#A(href=/advertise/)
#A(href^=http://www.google.com/pagead)
dictionary.reference.com#A(href^=http://www.google.com/url?sa=L&ai=)
#IMG(src^=http://ad.uk.doubleclick.net)
#IMG(src^=http://ad.doubleclick.net)
yahoo.com#A(href=http://us.ard.yahoo.com/SIG=12lt27gkl/M=570179.11705344.12177319.9641256/D=yahoo_top/S=2716149:HDLN/_ylt=AvsqK7FgUbxkrtlnjbKs1lP1cSkA/Y=YAHOO/EXP=1193800089/A=5005233/R=0/SIG=14m0dtrqi/*https://www.getsmart.com/refi/qform.asp?bp=ltquickmatch&esourceid=1271910&promo=00221&num=1-866-262-6895&AdType=2&version=45&disable_popups=1&init=1)
howstuffworks.com#A(class=reify-linkifier)
#DIV(class=topbanners)
#DIV(id=holidayad)
#DIV(class=doubleClickAd)
#*(class=doubleClick)
#DIV(class=adText)
guide.opendns.com#DIV(id=noresultsads)
#DIV(class=ad_itext_bar)
search.com#UL(class=sponsored)
experts-exchange.com#DIV(class=ontopBanner)
guide.opendns.com#DIV(id=adbox)
us.f812.mail.yahoo.com#TABLE(id=welcomeAdsContainer)
books.google.com#DIV(class=ad)
weather.yahoo.com#DIV(class=yw-ad)
lifehacker.com#DIV(id=sitemeter)
#DIV(class=advertContainer)
Taboo: Can't read it now? Save it for later.
Caveat lector: I wrote this post in high school; it’s likely outdated and poorly written.
Taboo is basically a temporary bookmarks manager. If you have found an article that you find interesting but it is too long you would normally have 3 options.
- Bookmark it.
- Leave the tab open and move on.
- Close the tab and find it in your history.
All of these options have one major problem: Clutter. Bookmarks can either be stored in a menu or the bookmarks toolbar. This is fine for sites that are frequented often or are permanent references but temporary bookmarks make the perminant bookmarks harder to find. A separate temporary bookmarks folder is fine but it can be very hard to find a specific bookmark mixed in with all of the other temporary bookmarks. Leaving the bookmark in your tabbar makes sorting through your tabs frustrating. The history is normaly erased after a set period of time ind is a pain to look through.
Taboo solves these problems. If you can’t remember the sites name, you can look for the thumbnail of the site. If you can only remember when you looked at the site you can view your taboos in calendar mode. If you know that you added your taboo recently (within the last 10 or so) you can use the menu attached to the “View Taboos” button as the list is sorted by most recently added. Taboo is a beta so more features should appear as time goes on.
Screenshots:
Scribefire: Cool but not perfect
Caveat lector: I wrote this post in high school; it’s likely outdated and poorly written.
Scribefire is a very useful extension and can even upload images to blogger but has a few annoying “bugs” for lack of a better word.
Scribefire pre-release and dark-themes (gtk) don’t mix well (it looks very ugly). Scribefire current release works better with dark themes but not perfectly.
Scribefire can upload images but does not upload them to the standard server (it uploads them to “Picasa web albums”) and, unlike the default editor, it simply places a shrunken version of the image on the webpage and does not link it to its bigger version. This is easily fixable but annoying (especially when using lightbox).
Too many features and few options to trim down the UI.
Verdict: Fun but not for me (yet).
Xname.org
Caveat lector: I wrote this post in high school; it’s likely outdated and poorly written.
I just signed up with 1and1.com and found that they do not offer marginally advanced DNS settings and allow only five subdomains. To work around these limitations I signed up with Xname.org. They allow unfettered customization of the DNS record and are free. I very much recommend them (and thank them).