blog: add some older articles from my medium blog
This commit is contained in:
parent
33acf1acae
commit
830ad3a7ae
|
@ -0,0 +1,59 @@
|
|||
---
|
||||
title: My Experience with Atom as A Vim User
|
||||
date: 2014-11-18
|
||||
from: medium
|
||||
---
|
||||
|
||||
My Experience with Atom as A Vim User
|
||||
=====================================
|
||||
|
||||
Historically, I am a Vim user. People know me as a very very heavy vim
|
||||
user. I have spent almost the last two years customizing [my .vimrc
|
||||
file](https://github.com/Xe/dotfiles/blob/master/.vimrc) and I have parts
|
||||
of it mapped to the ways I think. Recently I have acquired both a Mac Pro
|
||||
and a Surface Pro 3, and my vim configuration didn't work on them. For a
|
||||
while I had used Docker and the image I made of my preferred dev
|
||||
environment to shim and hack around this.
|
||||
|
||||
Then I took a fresh look at [Atom](https://atom.io/){.markup--anchor
|
||||
.markup--p-anchor}, Github's text editor that claims to be a replacment
|
||||
for Sublime. Since then I have moved to using Atom as my main text
|
||||
editor for programming in OSX and Windows, but still using my fine-tuned
|
||||
vim setup in Linux. I like how I have Atom set up. It uses a lot of (but
|
||||
not all sadly) the features I have come to love in my vim setup.
|
||||
|
||||
I also like that I can have the same setup on both my Mac and in
|
||||
Windows. I have the same
|
||||
[vim-mode](https://github.com/atom/vim-mode) bindings on both my machines
|
||||
(I only customize so far as to add :w and :q bindings), and easily jump
|
||||
from one to the other with Synergy and have little to no issues with
|
||||
editor differences. I typically end up taking my surface out with me to
|
||||
a lot of places and will code some new ideas on the bus or in the food
|
||||
court of the mall.
|
||||
|
||||
Atom gets a lot of things right with the plugins I have. I have
|
||||
Autocomplete+ and a plugin for it that uses GoCode for autocompletion as
|
||||
I type like I have with vim-go and YouCompleteMe in Vim. Its native
|
||||
pacakge support and extensibility is bar none the easiest way to be able
|
||||
to add things to the editor I have ever seen.
|
||||
|
||||
But there are problems with Atom that are mostly based on my usage of
|
||||
text editors and my understanding of programming with Javascript,
|
||||
Coffeescript, HTML and CSS. Atom is a mostly Coffeescript editor, it
|
||||
does mean that at runtime I can customize almost any aspect of the
|
||||
editor, but I would have to learn one if not 5 more languages to be able
|
||||
to describe the layouts or interfaces I would like to add to this
|
||||
editor. It also being a hybrid between a web application and a normal
|
||||
desktop application means that I am afraid to add things I normally
|
||||
would such as raw socket support for being able to collaborate on a
|
||||
single document, PiratePad style. Additionally, the Vim emulation mode
|
||||
in Atom doesn't support ex-style :-commands nor \<Leader\>, meaning that
|
||||
a fair bit of my editing is toned down and done more manually to make up
|
||||
for this.
|
||||
|
||||
I wish I could just use vim natively with my preferred setup on Windows,
|
||||
OSX and Linux, but for now Atom is the lesser of all the evils.
|
||||
|
||||
---
|
||||
|
||||
Update: I am now atom-free on my surface pro 3
|
|
@ -0,0 +1,71 @@
|
|||
---
|
||||
title: Web Application Development with Beego
|
||||
date: 2014-11-28
|
||||
---
|
||||
|
||||
Web Application Development with Beego
|
||||
======================================
|
||||
|
||||
Beego is a fantastic web application framework from the Go China
|
||||
community. It currently powers some of the biggest websites in China,
|
||||
and thus the world.
|
||||
|
||||
Let's get started. For now I am going to assume you are running OSX or
|
||||
Linux. Getting Beego set up on Windows with the sqlite driver is
|
||||
nontrivial at best due to Windows being terrible.
|
||||
|
||||
### Installing Beego
|
||||
|
||||
The Beego developers have made a tool called bee for easier managing of
|
||||
Beego projects. To install it, run:
|
||||
|
||||
```
|
||||
go get github.com/beego/bee
|
||||
go get github.com/astaxie/beego
|
||||
```
|
||||
|
||||
The `bee` tool will be present in `$GOPATH/bin`. Please make sure this
|
||||
folder is in your `$PATH` or things will not work.
|
||||
|
||||
### Creating a Project
|
||||
|
||||
Navigate to a directory in your `$GOPATH` and run the command `bee new
|
||||
quickstart`:
|
||||
|
||||
![](https://d262ilb51hltx0.cloudfront.net/max/800/1*ATTbb_23WVmxgoFweXSXQg.png)
|
||||
|
||||
The `bee` tool created all the scaffolding we needed for our example
|
||||
program. Change into that directory and run `bee run`. Your
|
||||
application will be served on port 8080.
|
||||
|
||||
![](https://d262ilb51hltx0.cloudfront.net/max/800/1*DG8Tl71KXYdiddV1x6m0GQ.png)
|
||||
|
||||
Now let's take a look at the parts of Beego that are in use. Beego is a
|
||||
typical MVC style framework so there are 3 basic places you may need to
|
||||
edit code:
|
||||
|
||||
The Models are Beego's powerful database-backed models (we'll get into
|
||||
those in a little bit), the Views are normal Go
|
||||
[html/template](https://godoc.org/html/template)s, and
|
||||
the Controllers are the Go code that controls the Views based on the Models.
|
||||
|
||||
![](https://d262ilb51hltx0.cloudfront.net/max/600/1*EZ1qIqeXNW_NfKuLbudogA.png)
|
||||
|
||||
New Beego projects use Beego's default HTTP router, which is similar to
|
||||
Sinatra or Tornado. The default router is very simple. It will only
|
||||
route `/` to the MainController that was generated for you:
|
||||
|
||||
![](https://d262ilb51hltx0.cloudfront.net/max/800/1*t_oEyk6kSa1Y940m2fnwmg.png)
|
||||
|
||||
The main file will shadow-include the router package which will seed the
|
||||
Beego router with your paths and site content. The MainController will
|
||||
embed beego.Controller so it acquires all instance methods that a Beego
|
||||
controller needs. Beego's controllers offer many methods that could be
|
||||
used based on different HTTP verbs, but this simple example only
|
||||
overrides the GET verb to serve the site. The data that will be passed
|
||||
to the template is a `map[string]interface{}` as c.Data. The last line
|
||||
tells Beego what template to render for the page, in this case
|
||||
"index.tpl". If you don't set the template it will default to
|
||||
"controller/method\_name.tpl" where method\_name is the method that was
|
||||
called on the controller. In this example it would be
|
||||
"maincontroller/get.tpl"
|
|
@ -0,0 +1,105 @@
|
|||
---
|
||||
title: Dependency Hell
|
||||
date: 2014-11-20
|
||||
---
|
||||
|
||||
Dependency Hell
|
||||
===============
|
||||
|
||||
A lot of the problem that I have run into when doing development with
|
||||
nearly any stack I have used is dependency management. This relatively
|
||||
simple-looking problem just becomes such an evil, evil thing to tackle.
|
||||
There are several schools of thought to this. The first is that
|
||||
dependencies need to be frozen the second you ever see them and are only
|
||||
upgraded once in a blue moon when upstream introduces a feature you need
|
||||
or has a CVE released. The second is to have competent maintainers
|
||||
upstream that follow things like semantic versioning.
|
||||
|
||||
### Ruby
|
||||
|
||||
Let's take a look at how the Ruby community solves this problem.
|
||||
|
||||
One job I had made us need to install **five** versions of the Ruby
|
||||
interpreter in order to be compatible with all the different projects
|
||||
they wrote. To manage the five versions of the Ruby interpreter, they
|
||||
suggested using a widely known tool called
|
||||
[rbenv](https://github.com/sstephenson/rbenv).
|
||||
|
||||
This isn't actually the full list of rubies that job required. I have
|
||||
decided not to reveal that out of interest of privacy as well as the
|
||||
fact that even Gentoo did not ship a version of gcc old enough to build
|
||||
the oldest ruby.
|
||||
|
||||
After all this, of course, all the dependencies are locked using the gem
|
||||
tool and another helper called bundler. It's just a mess.
|
||||
|
||||
There are also language design features of ruby that really do not help
|
||||
with this all that just make simple things like "will this code run or
|
||||
not" be determined at runtime. To be fair, Python is the same way, as is
|
||||
nearly every other scripting language. In the case of Lua this is
|
||||
*beyond vital* because of the fact that Lua is designed to be embedded
|
||||
into pretty much anything, with arbitrary globals being set willy-nilly.
|
||||
Consequently this is why you can't make an autocomplete for lua without
|
||||
executing the code in its preferred environment (unless you really just
|
||||
guess based on the requires and other files present in the directory).
|
||||
|
||||
### Python
|
||||
|
||||
The Python community has largely copied the ruby pattern for this, but
|
||||
they advocate creating local, project-specific prefixes with all of the
|
||||
packages/eggs you installed and a list of them instead of compiling an
|
||||
entire Python interpreter per project. With the Python 2-\>3 change a
|
||||
lot of things did break. This is okay. There was a major version bump.
|
||||
Of course compiled modules would need to be redone after a change like
|
||||
that. I think the way that Python handles Unicode in version 3 is ideal
|
||||
and should be an example for other languages.
|
||||
|
||||
Virtualenv and pip is not as bad as using bundler and gem for Ruby.
|
||||
Virtualenv very clearly makes changes to your environment variables that
|
||||
are easy to compare and inspect. This is in contrast to the ruby tools
|
||||
that encourage global modifications of your shell and supercede the
|
||||
packaged versions of the language interpreter.
|
||||
|
||||
The sad part is that I see [this pattern of senseless locking of
|
||||
versions continuing
|
||||
elsewhere](https://github.com/tools/godep) instead of proper
|
||||
maintenance of libraries and projects.
|
||||
|
||||
### Insanity
|
||||
|
||||
To make matters worse, people suggest you actually embed all the source
|
||||
code for every dependency inside the repository. Meaning your commit
|
||||
graphs and code line counts are skewed based on the contents of your
|
||||
upstream packages instead of just the code you wrote. Admittedly,
|
||||
locking dependencies like this does mean that fantastic language level
|
||||
tools such as [go
|
||||
get](https://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies)
|
||||
work again, but overall it is just not worth the pain
|
||||
of having to manually merge in patches from upstream (but if you do
|
||||
think it is worth the pain contact me, I'm open for contract work)
|
||||
making sure to change the file paths to match your changes.
|
||||
|
||||
### The Solution
|
||||
|
||||
I believe the solution to all this and something that needs to be a
|
||||
wider community effort for users of all programming languages is the use
|
||||
of a technique called [semantic
|
||||
versioning](http://semver.org/). In
|
||||
some lanaguages like Go where the [import paths are based on repository
|
||||
paths](https://golang.org/doc/code.html#PackagePaths), this may mean that
|
||||
a new major version has a different repository. This is okay. Backward
|
||||
compatability is good. After you make a stable (1.0 or whathaveyou)
|
||||
release, nothing should be ever taken away or changed in the public API.
|
||||
If there needs to be a change in how something in the public API works,
|
||||
you must keep backwards compatabilty. As soon as you take away or modify
|
||||
something in the public API, you have just made a significant enough
|
||||
change worthy of a major release.
|
||||
|
||||
We need to make semver a de-facto standard in the community instead of
|
||||
freezing things and making security patches hard to distribute.
|
||||
|
||||
Also, use the standard library more. It's there for a reason. It doesn't
|
||||
change much so the maintainers are assumed to be sane if you trust the
|
||||
stability of the language.
|
||||
|
||||
This is just my \$0.02.
|
|
@ -0,0 +1,46 @@
|
|||
---
|
||||
title: Instant Development Environments in Docker
|
||||
date: 2014-10-24
|
||||
---
|
||||
|
||||
Instant Development Environments in Docker
|
||||
==========================================
|
||||
|
||||
I have been using a few shell scripts for turbocharging development
|
||||
using Docker and today I have released the first version of a simple
|
||||
tool I call "[dev](https://github.com/Xe/dev)". Usage is very very simple.
|
||||
|
||||
```
|
||||
$ dev up
|
||||
Starting up container for spike
|
||||
spike-dev (43c5c1) running!
|
||||
To use this container please attach to it with:
|
||||
$ docker attach spike-dev
|
||||
$ docker attach spike-dev
|
||||
docker:dev:spike ~
|
||||
-->
|
||||
```
|
||||
|
||||
I have made a simple [asciinema
|
||||
recording](https://asciinema.org/a/13158) describing the process of setting up and tearing down
|
||||
these containers. The development environments have the code you are
|
||||
working on mounted to \~/dev in the container.
|
||||
|
||||
The containers are defined by a simple manifest file in yaml:
|
||||
|
||||
```
|
||||
base: xena/base
|
||||
repopath: github.com/Xe/test
|
||||
golang: false
|
||||
ssh: true
|
||||
user: xena
|
||||
projname: test
|
||||
```
|
||||
|
||||
Right now dev is a very immature tool and currently Works For Me ™. If
|
||||
you have any issues with it or questions about it, please open an issue
|
||||
on its [GitHub issue
|
||||
tracker](https://github.com/Xe/dev/issues/new).
|
||||
|
||||
Thanks for taking a look at it and please let me know if it works for
|
||||
you too!
|
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: MPD Via Docker
|
||||
date: 2014-10-20
|
||||
---
|
||||
|
||||
|
||||
MPD Via Docker
|
||||
==============
|
||||
|
||||
Today I got mpd set up inside docker to replace running it locally.
|
||||
|
||||
|
||||
Being the perfectionist I am, I also got a simple web UI for mpd
|
||||
([ympd](http://www.ympd.org/)) set up.
|
||||
|
||||
You can find the source repos here:
|
||||
|
||||
- [<https://github.com/Xe/docker-ympd>\
|
||||
The ympd web frontend]
|
||||
- [<https://github.com/Xe/docker-mpd-kabaka>\
|
||||
A good friend's patchset to mpd in the form of a docker
|
||||
container]
|
||||
- [<https://github.com/Xe/docker-ncmpcpp>\
|
||||
ncmpcpp for controlling mpd from the command line]
|
||||
|
||||
Readmes will be in each repository shortly.
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
title: Old Articles Recovered
|
||||
date: 2019-01-17
|
||||
---
|
||||
|
||||
# Old Articles Recovered
|
||||
|
||||
I found an old backup that contained a few articles from my old [Medium](https://medium.com/@theprincessxena) blog. I have converted them to markdown and added them to the blog archives:
|
||||
|
||||
- 2014-11-28 - [Web Application Development with Beego](https://christine.website/blog/beego-2014-11-28)
|
||||
- 2014-11-20 - [Dependency Hell](https://christine.website/blog/dependency-hell-2014-11-20)
|
||||
- 2014-11-18 - [My Experience with Atom as A Vim User](https://christine.website/blog/atom-as-vim-2014-11-18)
|
||||
- 2014-10-24 - [Instant Development Environments in Docker](https://christine.website/blog/dev-2014-10-24)
|
||||
- 2014-10-20 - [MPD Via Docker](https://christine.website/blog/mpd-docker-2014-10-20)
|
||||
|
||||
I hope these are at all useful.
|
Loading…
Reference in New Issue