суббота, 23 февраля 2013 г.

Проблема SSL при использовании svn из командной строки
Решение:
sudo apt-get install libneon27-dev
cd /usr/lib
sudo mv libneon-gnutls.so.27 libneon-gnutls.so.27.old
sudo ln -s libneon.so.27 libneon-gnutls.so.27

Англо-Русский перевод из Python на основе API Яндекс.Перевода

При чтении англо-язычной литературы часто хочется подсмотреть перевод незнакомых слов. Для этого в браузерах есть плагины, например в Chrome и в Firefox. Руки тянутся делать и вне браузера. Один из способов - уподобится плагинам, испльзуя api одного из онлановых переводчиков, например от Яндекс. Оный предоставляет xml и json форматы выхлопа. Используем json.
Скрипт читает английский стандартный ввод и пишет по-русский в стандартный вывод.


#!/usr/bin/env python
import httplib
import sys
from string import maketrans
import json

HOST = "translate.yandex.net"
RSRC = "/api/v1/tr.json/translate?lang=en-ru"
HTTP_OK = 200
TRANS_OK = 200

def outResult(uData):
result = uData.encode("utf8")
return result

def readFromStdIn():
result = ""
for line in sys.stdin:
result += "&text=" + line.strip()
return result

def prepareURL(arg):
text = arg.strip()
transTable = maketrans(" ?", "+.")
text = text.translate(transTable)
return text

def parseJSONResponseToList(dataString):
respDict = json.loads(dataString)
transCode = respDict['code']
if transCode == TRANS_OK:
lineList = respDict['text']
else:
lineList = None
return lineList


def getResponse(host, rsrc):
h = httplib.HTTP(host)
h.putrequest("GET", rsrc)
h.putheader("Host", host)
h.putheader("User-agetnt", "python httplib on linux 3")
h.endheaders()
retCode, retMsg, headers = h.getreply()
if retCode == HTTP_OK:
f = h.getfile()
line = f.read()
f.close()
return line
else:
print retCode, headers, retMsg

#prepare translate

respLine = getResponse(HOST, RSRC + prepareURL(readFromStdIn()))
transLines = parseJSONResponseToList(respLine)
translation = u''
for line in transLines:
translation += line + ' '
try:
outLine = outResult(translation)
except:
pass
print outLine

Надо бы добавить определение языка, передачу через аргументы командной строки, обработку ошибок...

Чтобы переводить выделенный текст используем xclip и bash :

#!/bin/bash
xclip -o | /home/maa/soft/shell/yandex_translate_en-ru.py | while read MESSAGE; do notify-send Перевод "`xclip -o` : $MESSAGE"; done


И, наконец, вешаем на shell скрипт хоткей. 

пятница, 22 февраля 2013 г.

Читать из стандартного ввода/вывода stdin


Python: прочитать stdin

#!/usr/bin/env python
import sys

lines = ""
for line in sys.stdin:
    lines = lines  + line.strip() #склеиваем и кастрируем конец строки
print lines

На выхлопе одна строка, склеенная из stdin