воскресенье, 7 ноября 2010 г.

SSH Agent Forwarding

Возникла у меня на днях такая задачака:
Есть машина(m1) с парой ключей(private and public), я захожу через ssh на другую машину(m2), на которой лежит только публичный ключ, затем с машины(m2) хочу сделать clone git репозитория(на git'овом сервере тоже лежит публичный ключ), но git отвечает: Permission denied (publickey) т.к. моего private ключа на машине(m2) нет.


Решение проблемы:
  1. Запускаем ssh-agent на машине(m1):
    eval `ssh-agent`
    Его нужно запустить только если он ещё не запущен
  2. Добавляем ключ агенту:
    ssh-add
    По умолчанию добавится id_rsa ключ
  3. Проверяем добавился ли ключ:
    ssh-add -l
  4. Подключаемся к хосту через ssh клиенту с опцией -A(либо можно с опцией -o "ForwardAgent yes"):
    ssh -A somebody@somehost
    Либо можно добавить в ssh config:
    Host *
         ForwardAgent yes
  5. Делаем git clone или что мы там хотели и обязательно радуемся, потому-что все работает :)

Полезная ссылочка
An Illustrated Guide to SSH Agent Forwarding

Читать далее

воскресенье, 16 мая 2010 г.

Python client for GoogleTranslate

Есть две хороших и удобных штуки: сервис GoogleTranslate и *nix сonsole. И я решил подружить их =). Вообщем решил написать консольный клиент для GoogleTranslate.

В качестве языка выбрал python. Побродив по просторам всемирной паутины, готовой имплиментации python API для GoogleTranslate не обнаружил. Пришлось разбиратся самому. Вообщем-то ничего сложного:

Обращаемся по URL(пример которого приведен ниже) в ответ получам JSON со статусом ответа, и если все хорошо то там же найдем и перевод:

URL:

http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=[FROM]%7C[TO]&q=[TEXT]

FROM - из какого языка переводить
%7С - разделитель в виде вертикальной черты(|)
TO - в какой язык переводить
TEXT - текст который нужно перевести


Ответный JSON:

{responseData: {translatedText: [TEXT]}, responseDetails: None, responseStatus: [STATUS]}

translatedText - переведенный текст
responseStatus - статус сообщения

Так как я использую python 2.5, для работы с JSON легким движением руки установил simplejson

  1. sudo apt-get install python-simplejson



После этого написал модуль для работы с GoogleTranslate API:


  1. #!/usr/bin/env python

  2.  

  3. import simplejson

  4. import urllib

  5. import sys

  6.  

  7. GOOGLE_TRANSLATE_AJAX_URL = "http://ajax.googleapis.com/ajax/services/language/translate?"

  8. LANGUAGE_SEPARATOR = "|"

  9. RESPONSE_STATUS = "responseStatus"

  10. RESPONSE_DATA = "responseData"

  11. TRANSLATED_TEXT = "translatedText"

  12.  

  13. def translate(fromLanguage, toLanguage, text):

  14.         """ Translate text using google translate service"""

  15.         # Generate url

  16.         url = GOOGLE_TRANSLATE_AJAX_URL + urllib.urlencode({"v" : "1.0", \

  17.                         "langpair" : fromLanguage + LANGUAGE_SEPARATOR + toLanguage, \

  18.                         "q" : text})

  19.  

  20.         result = simplejson.load(urllib.urlopen(url))

  21.        

  22.         if (result[RESPONSE_STATUS]== 200):

  23.                 return result[RESPONSE_DATA][TRANSLATED_TEXT]



Вот такой простенький модуль получился =).

Ну а теперь код основного скрипта:

  1. #!/usr/bin/env python

  2.  

  3. from googledict import translate

  4. import sys

  5.  

  6. def main(args):

  7.        

  8.         fromLanguage = args[0][:2]

  9.         toLanguage = args[0][2:]

  10.         text = args[1]

  11.  

  12.         print translate(fromLanguage, toLanguage, text)

  13.  

  14. if __name__ == "__main__":

  15.         main(sys.argv[1:])



Ну вот и подружились =):

>./gt.py enru "Hello world"

Привет мир

Простенький скриптик всего с 2-мя аргументами. Первый аргумент состаит из двух частей, первые 2-е буквы это язык из которого переводим, вторые 2-е в который переводим. Ну а второй аргумент собственно что переводим.

Сорци всего этого добра можно найти Тут
Всем спосибо кто дочитался до этих строк.
Всего доброго...

Читать далее

вторник, 9 февраля 2010 г.

Борьба с hibernate LazyInitializationException

Сделай настолько просто, насколько это возможно, но не проще А. Эйнштейн
Доброе время суток!
По просьбе коллег пишу этот пост.
Суть проблеммы:
Когда мы по запросу подтягиваем hibernate сущность содержащую поля инициализирующиеся как Lazy, и пытаемся отобразить эти поля например на странице, то мы получаем LazyInitializationException.

Причина проблемы:
В момент обращения к сущности на странице, сессия уже закрыта и сущность находится в так называемом detached состоянии (более подробно о состояниях тут), отсюда то нам и не удается запросить у сущности её Lazy поля.
Решение:
Решение этой проблемы напрашивается само, сессию нужно держать открытой до тех пор пока не отдадим страницу.
Так как мы используем spring то и решение этой проблемы, будет расмотрено в рамках spring.
Необходимо добавить в свой web.xml spring'овый фильтр который и будет держать сессию открытой.
Вот как это выглядит:

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>

Здесь sessionFactory это имя той hibernate фабрики которую вы инициализировали в своем application context'е.

Ну вот собственно и все, после объявления данного фильтра никаких LazyInitializationException поидее у вас быть не должно =).

По этой же теме hibernate community

До новых встреч!)

Читать далее