Tuesday, December 03, 2013

How to make Python raw_input ignores Ctrl-D

The way to do this is to have a while loop around raw_input, and not print the question again in the next iteration. However, because of this Python bug http://bugs.python.org/issue12833, raw_input() or raw_input('') will erase the previous printed question in stdout output with a backspace. A workaround will be needed. Then, there's also a problem with Ctrl-D after you input something... Here's the code to handle Ctrl-D and quit at Ctrl-C without the stacktrace:
import readline
import sys

sys.stdout.write("question? ")
while True:
    try:
        print raw_input(" \b")
        break
    except EOFError:
        pass
    except KeyboardInterrupt:
        break
"import readline" will handle the Ctrl-D when you got something input at the question.

Monday, July 22, 2013

Syntax error near unexpected token LIBHTPMINVERSION PKG_CHECK_MODULES in Ubuntu

When compiling suricata 1.4.1 fresh in Ubuntu, after apt-get install all the necessary dependencies, you may see this:
syntax error near unexpected token `LIBHTPMINVERSION,'
`        PKG_CHECK_MODULES(LIBHTPMINVERSION,
Well, if you google it, it's more like you need to install pkg-config. However, I have it installed. There was another post saying, maybe my pkg-config is not updated... Turns out the workaround is to modify the ACLOCAL_FLAGS described here. By default, it's
export ACLOCAL_FLAGS="-I /usr/share/aclocal"

Thursday, July 11, 2013

Monkey patch (mock) the built-in raw_input function

For testing without mock (thirdparty or 3.x), I wrote a mock context manager function for raw_input. If you do not provide enough response in the mock_raw_input argument list, the raw_input is back to normal.
import __builtin__
import sys
from contextlib import contextmanager

@contextmanager
def mock_raw_input(*input_list):
    """Monkey patch the raw_input()"""
    _raw_input = __builtin__.raw_input
    def _stub(prompt='', input_iter=iter(input_list), orig=_raw_input):
        try:
            _input = next(input_iter)
            sys.stdout.write(prompt)
            return _input
        except StopIteration:
            __builtin__.raw_input = _raw_input
            return raw_input(prompt)
    __builtin__.raw_input = _stub
    try:
        yield
    finally:
        __builtin__.raw_input = _raw_input

def main():
    with mock_raw_input('abc','cde'):
        print raw_input('abc?\n')
        print raw_input()
        print raw_input('no more expected value? ')
    raw_input('raw_input should be back to default here, right? ')

if __name__ == "__main__":
    main()

Friday, March 22, 2013

Socket.IO 0.9.x client disconnect failed when using namespace

socket.disconnect() used to be working with my server. Then I changed my server to be using namespace, and the client side disconnect no longer works. Luckily I can find this from Google.
 socket.socket.disconnect()  

Thursday, March 21, 2013

Click a button to print an embedded PDF file without the printing dialog in Internet Explorer (silent print)

I recently helped a friend implementing a button to click, and it sends a hosted pdf to the defaulted printer without the printing dialog in IE8. I googled this about a few dozen pages and finally came across http://stackoverflow.com/questions/975652/silent-print-a-embedded-pdf. So here is the test.html. And due to the ActiveX used, you have to make this page to be trusted or in intranet.
 <html>  
 <head>  
 <title>Test</title>  
 <script>  
 function printpdf(pdf_path) {  
  // remove the previous pdf <object> if existed  
  var elem = document.getElementById("pdf");  
  if (elem) {  
   elem.parentNode.removeChild(elem);  
  }  
  document.body.insertAdjacentHTML('beforeEnd', '<object id="pdf" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" width="0" height="0"><param name="src" value="' + pdf_path + '"/></object>');  
  pdf.printAll();  
  return false;  
 }  
 </script>  
 </head>  
 <body>  
 <!-- http://stackoverflow.com/questions/975652/silent-print-a-embedded-pdf -->  
 <button onclick="printpdf('sample.pdf');">Print PDF</button>  
 </body>  
 </html>  
I put it in my dropbox as well: https://dl.dropbox.com/u/48348/pdf/pdf.html (put dropbox domain into trusted sites) EDIT: Adobe Reader 8 was reported to leave a blank Adobe Reader application running whenever you click, then version 11 doesn't have this problem.

Wednesday, February 20, 2013

Python datetime timestamp conversion between timezones

Recently, I needed to deal with some datetime/timestamp conversion between timezones in Python.
from datetime import datetime, timedelta
from dateutil import tz

utc = tz.tzutc()
local = tz.tzlocal()

# http://stackoverflow.com/questions/8777753/converting-datetime-date-to-utc-timestamp-in-python/8778548#8778548
def to_timestamp(dt_in_utc, epoch=datetime(1970, 1, 1, tzinfo=utc)):
    td = dt_in_utc - epoch
    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 1e6

# datetime to utc, if the datetime has no tzinfo, treat it as local
def to_utc(dt):
    if dt.tzinfo is None:
        dt = dt.replace(tzinfo=local)
    return dt.astimezone(utc)
    
# utc timestamp to datetime
def to_datetime(timestamp, tz=local):
    return datetime.utcfromtimestamp(timestamp).replace(tzinfo=utc).astimezone(tz)