понедельник, 25 мая 2015 г.

python: 7 способов получить hostname

Все работают в линуксе, но далеко не все - в винде. Плюс в ряде случаев hostname и hostname -f могут не совпадать, надо проверить, что лучше подойдёт.

1) import os; print os.uname()[1]
2) import platform; print platform.uname()[1] - как 1, но более универсален, работает и в винде
3) import platform; print platform.node()
4) import socket; print socket.gethostname() (подвид: socket.gethostbyaddr(socket.gethostname())
5) import socket; print socket.getfqdn() - 4 и 5 как раз могут дать разные результаты
6 и 7) - совсем костыльные решения, os.getenv('HOSTNAME') и os.environ['HOSTNAME']

До кучи - есть всякие os.system() и os.popen(), но это совсем костыли и даже не стоят упоминания.

линки
https://wiki.python.org/moin/Powerful%20Python%20One-Liners/Hostname
http://stackoverflow.com/questions/20792499/how-to-get-fully-qualified-host-name-in-python
http://stackoverflow.com/questions/4271740/how-can-i-use-python-to-get-the-system-hostname

вторник, 19 мая 2015 г.

python и рекурсивная работа с файлами

1) os.listdir
import os
for filename in os.listdir(os.getcwd()):
if filename.endswith(".txt"):
print(os.path.join(root, file))

2) os.walk
import os
for root, dirs, files in os.walk(yourpath, topdown=False):
    for name in files:
        print(os.path.join(root, name))
        stuff
    for name in dirs:
        print(os.path.join(root, name))
        stuff

3) glob
import glob
for filename in glob.glob('*.txt'):
...

http://stackoverflow.com/questions/18262293/python-open-every-file-in-a-folder
http://stackoverflow.com/questions/3964681/find-all-files-in-directory-with-extension-txt-with-python

среда, 28 января 2015 г.

lua: получить размер файла

=========== funcs.lua
function fsize (file)
        local current = file:seek()      -- get current position
        local size = file:seek("end")    -- get file size
        file:seek("set", current)        -- restore position
        return size
end
=========== checklibs.lua
dofile("funcs.lua")

libs_file = io.open("librt.so.0","r")
print(fsize(libs_file))
libs_file:close()
===========

http://lua-users.org/lists/lua-l/2011-04/msg00785.html

Вероятный оригинал
http://www.lua.org/pil/21.3.html

В таком виде и гуляет функция fsize, даже с nginx связали
https://gist.github.com/perusio/2133228
location ~* \.(?:gif|jpe?g|png)$ {
set_by_lua $img_file_size '
function fsize (file)
local current = file:seek() -- get current position
local size = file:seek("end") -- get file size
file:seek("set", current) -- restore position
return size
end
fsize(ngx.var.request_filename)';
}

lua и sha*

В luarocks есть sha1 и sha2, в sha2 есть SHA-244, SHA-256, SHA-384, SHA-512
Требует сборки.

SHA-256 hashing algorithm by GravityScore
SHA-256 hashing algorithm by KillaVanilla
Завязаны на библиотеку bit, которая в 5.2 почему-то оказалась недоступна.

Совсем простой метод через openssl
function sysexec (str)
        local h = io.popen(str)
        local result = h:read("*a")
        h:close()
        result = string.gsub(result, "\n", "")
        return result
end

string1 = "encodeme"
run = "echo " .. string1 .. " | openssl sha256 | sed 's#(stdin)= ##'"
string2 = sysexec(run)

пятница, 12 сентября 2014 г.

Работаем с REST

Например, пишем своё апи и нужен некий стандарт, по которому будет взаимодействовать мир и наш апи. Раньше для этого использовали чистый XML и SOAP, сейчас всё более популярным становится rest-подход.
REST=REpresentational State Transfer
http://en.wikipedia.org/wiki/Representational_state_transfer

Много вопросов может вызывать, что передавать в заголовках, что в теле запроса.

Также нет чёткого разделения между PUT и POST, оба метода могут как добавлять записи, так и менять их. Тут совет такой: POST всегда добавляет запись, PUT добавляет если такой не было и меняет, если была. Это позволяет заново послать запрос, если нет уверенности в первом получении сервером, и это не должно вызывать дублей и ошибок.

Есть неплохое введение у Рея
Designing a RESTful API with Python and Flask
Writing a Javascript REST client
Designing a RESTful API using Flask-RESTful
Implementing a RESTful Web API with Python & Flask

Тут много интересного, в том числе замена POST-ом операций PUT и DELETE

пятница, 29 августа 2014 г.

Разбираемся с OAuth2

http://tools.ietf.org/html/draft-ietf-oauth-v2
https://ru.wikipedia.org/wiki/OAuth

OAuth 2.0 — протокол авторизации, позволяющий выдать одному сервису (приложению) права на доступ к ресурсам пользователя на другом сервисе. Протокол избавляет от необходимости доверять приложению логин и пароль, а также позволяет выдавать ограниченный набор прав, а не все сразу.
OAuth 2.0 простым и понятным языком

OAuth: описание протокола простым и понятным языком

О недостатках
http://hueniverse.com/2012/07/26/oauth-2-0-and-the-road-to-hell/


И еще линки
http://api.yandex.ru/oauth/doc/dg/reference/web-client.xml
http://api.yandex.ru/oauth/doc/dg/reference/obtain-access-token.xml#POST