- find files: fixed !cs search
- find files: implement !no (name only) option
- find files: speed up GetOverlappedParts()
- find files: add ‘Copy File Path’ and ‘Copy File Name’ context menu items
- find files: misc code tweaks
- find files: show horizontall scrollbar
- hopefully fixed the issue of stale notes on startup
- fixed staring/unstaring in note view
- made links in markdown preview to be _target=blank
- re-enabled redirect to https
- fully switched to showdown.js, removed marked and markdown-it (saved ~205 kB of JS)
- spent way too much time but hopefully fixed spurious updates of createdat time of notes when updating them
- published https://blog.kowalczyk.info/article/wjRD/collected-stories-of-solo-founder-with-profitable-businesses-for-your-startup-inspiration.html
- posted https://www.indiehackers.com/forum/post/-KnKqFrQ7t7vJSV73jjb?commentId=-KnL8CC2JRhUL9YNnyk2
- posted http://discuss.bootstrapped.fm/t/hi-im-tim-and-im-building-a-branded-forms-service/5121/4?u=kjk
- added example for writing to stdin to https://blog.kowalczyk.info/article/wOYk/advanced-command-execution-in-go-with-osexec.html
- quicknotes: fixed updating CreatedAt time for note when only UpdatedAt should be updated
- survived very hot day
- wrote draft of “3 ways to iterate in Go”
- left angry comments on HN. Shouldn’t do that.
- wrote http://discuss.bootstrapped.fm/t/critique-idea-collaborative-screen-sharing/5105/2
- wrote https://www.indiehackers.com/forum/post/-KmyIfWqa9bNPdiO_Veq?commentId=-KmyLD1Tnwpa8CH2WXMl
- blog: implemented a system to use header images when post has @header-image meta-data at the top
blog: prototypes adding title to header image http://i.imgur.com/7rxCjVE.png
The code for that:
<div class="article-header hide-mobile" style="position: relative"> <img class="hide-mobile" src="/gfx/headers/header-02.jpg"> <div style="position:absolute;bottom:0px;left:0px;padding:0.5em 1em; background-color:white;color:black;opacity:.7;font-size:18pt;font-weight: bold"> Advanced command execution in Go with os/exec </div> </div>
- failed to implement moving div on the page using drag events with vue.js
- implemented moving on div element using mousedown/mousemove/mouseup and tracking x/y offset from positioned saved in mousedown
- blog: added tag list to week/tag views; fixed tag detection
There’s a famous quote “Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.”.
I’ve never seen anyone disagree with that and yet Go, the only language that takes this principle seriously, is visciously denigrated because it didn’t add all those features that could possibly be added. Generics, fancy type system, optionals, non-nullable types, unions, exceptions.
I think it shows that most people don’t really understand the quote. They think that the opposite is “don’t add unnecessary features” and who would be in favor of unnecessary features?
But what the quote is really saying is: “you should resist adding features, even though they are useful; their cost is additional complexity and you should strive to keep complexity to minimum while still providing core value”.
It’s easy to agree with such a sentiment in abstract but when you start talking about concrete features, this wisdom suddenly disappears.
Features sell. The value of a feature is easy to visualize, the value of simplicity due to lack of the feature is not.
- posted https://www.reddit.com/r/golang/comments/6gtt61/advanced_command_execution_in_go_with_osexec/
- tweaked blog css to be readable on mobile. Still not great on my Nexus 5. I suck at CSS.
- https://audienceops.com/resources/videos/sell-to-strangers/ #watched
- https://github.com/kjk/quicknotes: fixed a bug of updating CreatedAt of note when updating existing note
#read #paypal #payments #seo #upwork
https://fman.io/blog/paypal-for-saas-99-problems/ describes using PayPal for implementing subscriptions for desktop software. Discussion: http://discuss.bootstrapped.fm/t/my-experiences-with-paypal-for-saas/5073/9
http://discuss.bootstrapped.fm/t/is-anyone-paying-for-seo-help-how-do-you-find-someone-who-is-doing-it-the-right-way-and-getting-results/1630/22 has seo tips for a specific site, but the advice would work for many others.
http://discuss.bootstrapped.fm/t/frustrated-with-upwork-etc-anyone-had-any-success/4550/9 : tips on how to hire people on upwork and similar sites. Also https://baremetrics.com/blog/startup-guide-to-hiring-remote-customer-support
- https://github.com/kjk/quicknotes: add Id: and Tag: when exporting /raw/n raw note
- https://github.com/kjk/quicknotes: redirect http => https
- posted https://www.indiehackers.com/forum/post/-KmAWdcuUKZ0d3WjQTw1?commentId=-KmODyuvCnN_0ibCoIe-
- updated https://github.com/sumatrapdfreader/sumatrapdf/wiki to point to sumatra website, not notion
- posted https://news.ycombinator.com/item?id=14534154
- posted https://news.ycombinator.com/item?id=14534161
- posted https://blog.kowalczyk.info/article/wOYk/advanced-command-execution-in-go-with-osexec.html
- tweaked sumatra website
- blog: sha1-ify /css/main.css
- show day of the note in /dailynotes on blog
- added unique ids to daily notes
- wrote /tools/generate-unique-id so that I can easily get unique ids for daily notes
- handle Id: and Title: metadata for daily notes
- implemented /raw/n in quicknotes
#read #business #startups
Title: Go is Moneyball For Programming Languages
Go is a controversial language, often criticized for lack of sophistication. “We know how to do things better!”.
I think of Go as Moneyball For Programming Languages: How to get maximum capability from minimal feature set.
Go makes much more sense when you look at it through “biggest bang for the buck” prism.
Go ruthlessly eliminates duplicate features and non-critical .
Enums? Can be replaced by idealized integers.
do/while loops? Can be replaced by slightly extended for.
Generics? You get the most common generic types built-in (slices and maps) but no user-defined generics.
Unit testing, benchmarking? You get that as part of standard library but it’s ridiculously minimal compared to, say, jUnit from Java world.
- implemented individual note view for notes
- added support for code syntax highlighting for notes
It’s also under-documented. Here’s how I started playing with it: * downloaded SDK (https://sciter.com/download/) into ~/Downloads folder and unzip * create alias for the test app: alias sciter=‘/Users/kjk/Downloads/sciter-sdk/bin.osx/scapp’ * added the above alias to ~/.bash_profile
When I’m prototyping:
- create app.html and write the code
- to run: sciter app.html
Given how poorly documented Sciter is, I mostly use samples/ from the SDK to learn how do interesting things.
Using scapp is a way to quickly prototype UI.
Insight: if your business is “better X”, you should use X to make sure you’re really improving on it. http://thestartuptoolkit.com/blog/2011/09/use-the-tools-youre-displacing/
https://vimeo.com/77265280, trying to understand capabilities of WebRTC. I want to build VNC client in the browser but without ability to open tcp/udp connections it’s not possible. And for local machines it’s not possible even when using a proxy server (website talks to a proxy, proxy talks to VNC server and tunnels the data to website).
“Every day for years, Trollope reported in his “Autobiography,” he woke in darkness and wrote from 5:30 a.m. to 8:30 a.m., with his watch in front of him.” http://www.newyorker.com/magazine/2004/06/14/blocked
If I was able to do coding like this, I would have written many more programs than I have.
Mostly finished local drive -> backblaze backup tool in Go. Backblaze is much cheaper at storage and bandwidth than S3 or Google Storage.
It’s content-addressable store so I never re-upload files.
High-level architecture of the backup tool:
- you provide a directory to backup and list of extensions to backup (it’s not a generic backup tool but a way to backup documents)
- the program traverses the directory recursively
- if a file has the right extension, calculate its sha1
- name of the file in backblaze is based on sha1 so it’s O(1) to check if it’s already there, in which case we skip the upload
Since the program is meant to be run many times over the same directories, I needed few tricks to make it faster:
- to avoid re-calculating sha1 of the file across the runs, I store previously calculated sha1 in a .csv “database”. It’s small enough that I can load existing database in memory on startup and update it by appending to .csv file as I calculate new sha1
- to speed up “is the file already there” check, I list all files in backblaze on startup, which gives me info about 1000 files per HTTP request (compared to more naive way of checking each file individually, which would require HTTP call for each file)
Go library I used for backblaze API had small bugs and inefficiencies, but the author fixed them in https://github.com/kurin/blazer/issues/16, https://github.com/kurin/blazer/issues/13, https://github.com/kurin/blazer/issues/14 within hours of reporting. Kudos because it’s rare.
Playing a bit with https://sciter.com (trying to build a UI version of https://github.com/jonas/tig). Sciter is very promising in the sense of allowing to build UI quickly. However, it’s badly documented. Good thing it has lots of examples in the SDK.