I've started playing with draftin.com, so far very nice.
draftin.com lets you publish documents to several sites, and if the site you want to publish to is not on the list - there are WebHooks.
I've written a small AppEngine service that is a WebHook for publishing draftin.com documents to gist. Feel free to use it and let me know if you find any errors.
Below is the server code, rest of the files are here.
If it won't be simple, it simply won't be. [Hire me, source code] by Miki Tebeka, CEO, 353Solutions
Monday, September 29, 2014
Monday, September 22, 2014
HTTP Proxy Stripping Headers (go)
At one of my clients, we wanted to write an HTTP proxy that strips some
of the headers sent from the target (backend). With
the help of golang-nuts mailing list - this turned out to be pretty simple.
Sunday, August 24, 2014
timeat on pypi
timeat is now on pypi. There's some extra code to get current time from NTP server. Should work both on Python 2.x and 3.x
Thursday, July 31, 2014
timeat in Go
Wrote timeat, which shows time at a specific location, in Go as well. (For comparison the Python version is here). To install either go get bitbucket.org/tebeka/timeat or download the executables.
Working in a multi-timezone team, this script comes handy from time to time (as well as worldtimebuddy :).
Working in a multi-timezone team, this script comes handy from time to time (as well as worldtimebuddy :).
Wednesday, July 16, 2014
Generating Byte Arrays for Assets in Go using xxd
Go's net/http server is
pretty fast, but sometimes you want to get faster. One way to do that is to create
a binary array in memory for static files (assets). Here''s how I generate the
byte arrays automatically with xxd.
Note that this makes the build go slower as you have more and bigger assets.If this is a problem, take a look at nrsc ;)
Since the go toolchain does not support custom steps currently, I''m using make.
Note that this makes the build go slower as you have more and bigger assets.If this is a problem, take a look at nrsc ;)
Since the go toolchain does not support custom steps currently, I''m using make.
Makefile
httpd.go
Sunday, July 06, 2014
Hook to Update Tag List when Changing git Branch
I use ctags with Vim
to move around. At work we use git feature
branches, which means code changes when you switch a branch. Here''s a very simple
post-checkout hook
to update the tag list whenever you switch branches.
Thursday, June 26, 2014
Use dict to Speed Up Your Code
In Python, dictionary access is very fast. You can use that to get some speedup in your code by replacing if/else with dictionary get.
In [1]: fn1 = lambda x: 1 if x == 't' else 0
In [2]: fn2 = {'t': 1, 'f': 0}.get
In [3]: %timeit fn1('y') # Check "True" branch
10000000 loops, best of 3: 124 ns per loop
In [4]: %timeit fn2('y')
10000000 loops, best of 3: 79.6 ns per loop
In [5]: %timeit fn1('f') # Check "False" branch
10000000 loops, best of 3: 125 ns per loop
In [6]: %timeit fn2('f')
10000000 loops, best of 3: 81.3 ns per loop
About 30% speedup - not bad :)
In [1]: fn1 = lambda x: 1 if x == 't' else 0
In [2]: fn2 = {'t': 1, 'f': 0}.get
In [3]: %timeit fn1('y') # Check "True" branch
10000000 loops, best of 3: 124 ns per loop
In [4]: %timeit fn2('y')
10000000 loops, best of 3: 79.6 ns per loop
In [5]: %timeit fn1('f') # Check "False" branch
10000000 loops, best of 3: 125 ns per loop
In [6]: %timeit fn2('f')
10000000 loops, best of 3: 81.3 ns per loop
About 30% speedup - not bad :)
Wednesday, June 04, 2014
HTTPDir - Small OSX Utility to Serve a Directory over HTTP
HTTPDir is a small utility that lets you serve content of a directory over HTTP.
This is handy when you develop static sites that has reference to external resources. It is also aimed to people who are not comfortable with the command line.
HTTPDir is a simple Python script that uses Tkinter. It is packed in a format that OSX recognizes as an application. See the code here (look under HTTPDir.app/Contents/MacOS).
This is handy when you develop static sites that has reference to external resources. It is also aimed to people who are not comfortable with the command line.
HTTPDir is a simple Python script that uses Tkinter. It is packed in a format that OSX recognizes as an application. See the code here (look under HTTPDir.app/Contents/MacOS).
Friday, May 23, 2014
"timeat" updated
timeat updated to use the new(ish) Google Time Zone API.
Oh, and there's also a Go version.
$ timeat haifa
Haifa, Israel: Fri May 23, 2014 22:16
$ timeat paris
Paris, France: Fri May 23, 2014 21:17
Paris, TX, USA: Fri May 23, 2014 14:17
Paris, TN 38242, USA: Fri May 23, 2014 14:17
Paris, IL 61944, USA: Fri May 23, 2014 14:17
Paris, KY 40361, USA: Fri May 23, 2014 15:17
Oh, and there's also a Go version.
Sunday, April 20, 2014
Important vs Urgent
This was a lesson I learned a long time ago, maybe other people will find it useful as well.
Look at the chart above, we divide tasks to four categories on the urgent/important dimensions. Let's look at each category:
Look at the chart above, we divide tasks to four categories on the urgent/important dimensions. Let's look at each category:
- Not urgent and important - this is where you (and most successful companies) should spent your time. This means investing in infrastructure, making your process more efficient ...
- JFDI. However if you find that most of your time is spent there - you're doing something wrong.
- Don't bother.
- This is the big time sucker. Try to avoid at all cost.
Note: "If everything is important, then nothing is." - Patrick Lencioni
Tuesday, April 01, 2014
Easy statsd metrics decorator and context manager
Easy statsd metrics decorator and context manager
statsd is very handy with creating metrics. Here's a decorator and context manager that simplify the usage even more.
Note: If you want to easily test your code, you can use this Vagrant VM.
Note: If you want to easily test your code, you can use this Vagrant VM.
Monday, February 17, 2014
Running commands via HTTP
Ran asked about invoking commands via HTTP interface. Here's a quick answer I came up with (using Flask).
Friday, January 24, 2014
pypi→u
I was trying to see if there's an annoucement list for Celery (which we use at work) - didn't find it. One thing led to another... and I wrote pypi→u, a service that emails you if there's a new version of packages your interested in.
It run on AppEngine (with some bootstrap sprinkeld on). You can view the source here.
Note that pypi→u is very alpha, handle with care. Suggestions, comments and bug reports are welcomed.
Friday, January 03, 2014
Current email setup: osx + homebrew + sup + davmail + getmail
At work we have an Exchange server for email (no POP3/IMAP) and most people use Outlook. However I prefer not to use outlook, here's what I came with:
I added DavMail to my "Login Items" so it starts when I login.
I have a cron job to run getmail every 3 minutes
*/3 * * * * /usr/local/bin/getmail -n -q
After the above changes, run the following commands:
sudo postmap /etc/postfix/sasl_passwd
sudo postfix reload
That's it, you should be set to go with a decent email client.
I also use iTerm2, which lets me click on a link on sup terminal and open it
- Sup as email client
- DavMail for POP3/SMTP
- getmail for fetching email
- Homebrew for unix-ish environment (yup, that's OSX for you)
DavMail
Install DavMail from the .dmg. Run it and point it to the exchange server URL and have it expose POP3 and SMTP. See ~/.davmail.properties (though it's easy to configure from the UI as well).I added DavMail to my "Login Items" so it starts when I login.
Homebrew
See the site for documentation on how to install.getmail
Install with "brew install getmail". I keep my mail in ~/Mail, see ~/.getmail/getmailrc.I have a cron job to run getmail every 3 minutes
*/3 * * * * /usr/local/bin/getmail -n -q
sup
sup is based on ruby. I've installed rbenv and ruby 1.9. "gem install sup" should work. (Note that I had trouble linking to ncurses, and had to run "brew link ncurses" before installing sup). See ~/.sup for configuration example.sendmail
Sending mail is done via the sendmail program that comes with OSX. A bit of configuration is needed though. See /etc/postfix/main.cf and /etc/postfix/sasl_passwdAfter the above changes, run the following commands:
sudo postmap /etc/postfix/sasl_passwd
sudo postfix reload
That's it, you should be set to go with a decent email client.
I also use iTerm2, which lets me click on a link on sup terminal and open it
Friday, December 13, 2013
Reading Passwords of OSX Keychain
OSX stores passwords in its keychain, which is sometimes useful when you forget a password. The command line security utility lets you access the keychain, however the output is somewhat cryptic.
Below is a little script to get user and password for a given domain.
find-pass.py signup.netflix.com
Note you might get an image like the image on the right. Click either "Allow" or "Always Allow".
Below is a little script to get user and password for a given domain.find-pass.py signup.netflix.com
Note you might get an image like the image on the right. Click either "Allow" or "Always Allow".
Thursday, November 28, 2013
Dealing with Bad Memory
The family joke is that I was born senile (my joke is that I have 1bit memory). During the years I've developed some methods to help me be be productive with bad memory. Hope they'll help you as well (if you remember them :).
JFDI
That's the most effective method - do it at the moment you remember. It's pretty amazing how many things you can do "right now" without interrupting your flow too much. Once you did it - there's no need to remember.
Make it Impossible to Forget
Yeah, writing things down help - but I forget to look at my lists. However if you make things impossible to forget - then you won't forget. For example if I need to take something to the car, I'll place it at the front door - can't miss it when I go out.
Get Help
May they be electronic or human, get some help. I married a wife with a phenomonal memory, but it's not an option for everyone :) In this digital age you can find a good non human assistent to help you. Hiring a human assitenet doesn't have to be expensive - see Fancy Hands for example.
Write It Down
We have a saying: "A short pencil is better than a long memory.". Write things down, it'll help you remember when you write then and later you can look them up. I use this blog as an memory of things that worked for me. Other things I use are pinboard, trello, GMail and Google Docs. Everything with a search function in it.
Forgive Yourself
You will forget things, learn to live with it. One of the worst things you can do it agonize over the things you forgot. It'll only add stress to your life without helping you to remember.
JFDI
That's the most effective method - do it at the moment you remember. It's pretty amazing how many things you can do "right now" without interrupting your flow too much. Once you did it - there's no need to remember.
Make it Impossible to Forget
Yeah, writing things down help - but I forget to look at my lists. However if you make things impossible to forget - then you won't forget. For example if I need to take something to the car, I'll place it at the front door - can't miss it when I go out.
Get Help
May they be electronic or human, get some help. I married a wife with a phenomonal memory, but it's not an option for everyone :) In this digital age you can find a good non human assistent to help you. Hiring a human assitenet doesn't have to be expensive - see Fancy Hands for example.
Write It Down
We have a saying: "A short pencil is better than a long memory.". Write things down, it'll help you remember when you write then and later you can look them up. I use this blog as an memory of things that worked for me. Other things I use are pinboard, trello, GMail and Google Docs. Everything with a search function in it.
Forgive Yourself
You will forget things, learn to live with it. One of the worst things you can do it agonize over the things you forgot. It'll only add stress to your life without helping you to remember.
Monday, November 25, 2013
Removing "noise" before matplotlib charts in IPython notebooks
By default, IPython notebook prints the value of the last expression. This works fine most of the time but sometimes the result of a chart is a long list of lines which is something you don't want to see - you just want to see the chart. Here are two options to fix this (you can also view the example notebook).
Wednesday, November 06, 2013
Decorators and Context Managers Workshop
I gave a workshop on decorators and context mangers at work.
Both are very powerful and will change the way you code in Python once you grok them. They mostly allow you to focus on application logic and write the "book keeping" code (logging, timing, resource allocation ...) in a separate place.
Here are the IPython notebooks:
And the solutions (but try to solve the exercises first):
If you want to run locally, the code is here.
Both are very powerful and will change the way you code in Python once you grok them. They mostly allow you to focus on application logic and write the "book keeping" code (logging, timing, resource allocation ...) in a separate place.
Here are the IPython notebooks:
And the solutions (but try to solve the exercises first):
If you want to run locally, the code is here.
Searching and Viewing emoji
We started using emoji at work. We're using Adium with the emoji xtra.
Here's a little script to search and optionally show emojis (requires matplotlib).
Here's a little script to search and optionally show emojis (requires matplotlib).
Wednesday, October 30, 2013
Making "pip" Faster
We use pip to install packages at work. Mostly in combination with virtualenv and wheel packages. Lately I had to re-install again and again a bunch of virtual environments and looks for a way to speed things up.
The solution was to cache the pip downloads and also to keep in a local directory the bigger .whl packages. All done in ~/.pip/pip.conf. Most of the downloads are done once now and using local .whl means no more compilation (I'm looking at you PyYAML ...). I didn't measure the time difference, but for sure it feels faster.
The solution was to cache the pip downloads and also to keep in a local directory the bigger .whl packages. All done in ~/.pip/pip.conf. Most of the downloads are done once now and using local .whl means no more compilation (I'm looking at you PyYAML ...). I didn't measure the time difference, but for sure it feels faster.
Subscribe to:
Posts (Atom)


